Я думаю, что люди смущены вашей терминологией. Одноканальное изображение - это 2D-массив ... многоканальное изображение будет трехмерным массивом (дополнительное измерение для хранения каждого канала). Например, одноканальное изображение будет полутоновым, но многоканальное будет цветным. Для получения дополнительной информации см. Channel (digital image)
Если вы хотите получить скалярный результат, вам нужно будет более точно узнать, как вы хотите уменьшить изображение до скаляра. Одним простым примером может быть массив norm
, как показано ниже, но этот выбор должен зависеть от вашего варианта использования.
a = imread('20091016_tumor_26_18245948_1chop.png') # a 2d input image
g = ndimage.gaussian_gradient_magnitude(a, 0.4) # a 2d image showing magnitude of the gradient in a
s = np.linalg.norm(g) # the scalar norm of the gradient
В вашем комментарии вы предположили, что вы пытались
grad = numpy.gradient(a)
a = numpy.sqrt(grad.dot(grad))
Проблема здесь, если вы хотите скаляр, в конце концов, является то, что многие (если не большинство) функции в NumPy, по по умолчанию, работают с каждым элементом массива. Так, в приведенном выше коде, gradient
дает градиент в каждом пикселе
a.shape
#(H, W)
grad.shape
#(2, H, W)
Поскольку сам градиент является вектором, он на самом деле добавляет с размерностью, поэтому 2d изображение становится 3d массива.
sqrt
и dot
(в данном случае) каждый возвращает массив того же размера, что и вход. Если вы используете dot
на двух массивах, он делает матричную версию a.T * b
Здесь a
и b
имеют одинаковую форму. Выход внутреннего или точечного произведения массива 1d или 2d имеет ту же ширину, что и правая сторона и та же высота, что и левая сторона, поэтому две квадратные матрицы дают квадратную матрицу.
Вот некоторые примеры:
a = Image.open('kinglet_bw.jpg')
plt.imshow(a)
for i, g in enumerate(np.gradient(a,3,3)):
plt.subplot(121+i)
plt.imshow(g)
g = ndimage.gaussian_gradient_magnitude(a, 3)
plt.imshow(g)
Величина градиента будет вычисляться на каждом пикселе, поэтому ваш результат будет такого же размера, как и входное изображение. – dabillox
wiki artcile на операторе sobel может дать вам некоторое представление о том, чего ожидать: http://en.wikipedia.org/wiki/Sobel_operator – dabillox
Но есть ли какие-либо ссылки на python для правильного вычисления его для получения изображения одного канала ? –