2013-11-08 6 views
0

Я новичок в python. Я пытаюсь прочитать изображение в многомерном массиве numpy и вычислить величину градиента, которая должна создать одноканальное изображение. Размеры после того, как я вычислил величину, однако, составляет 700 х 900. Может ли кто-нибудь помочь мне форматировать данные, чтобы я мог получить одноканальный образ?Многомерный массив и величина градиента

a = imread('20091016_tumor_26_18245948_1chop.png') 
ndimage.gaussian_gradient_magnitude(a, 0.4, a) 
+1

Величина градиента будет вычисляться на каждом пикселе, поэтому ваш результат будет такого же размера, как и входное изображение. – dabillox

+1

wiki artcile на операторе sobel может дать вам некоторое представление о том, чего ожидать: http://en.wikipedia.org/wiki/Sobel_operator – dabillox

+0

Но есть ли какие-либо ссылки на python для правильного вычисления его для получения изображения одного канала ? –

ответ

2

Я думаю, что люди смущены вашей терминологией. Одноканальное изображение - это 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) 

a

for i, g in enumerate(np.gradient(a,3,3)): 
    plt.subplot(121+i) 
    plt.imshow(g) 

g2

g = ndimage.gaussian_gradient_magnitude(a, 3) 
plt.imshow(g) 

g

0

Там повторно два варианта этого подхода:

Первый работает:

from Snaxel import Snaxel 
from Snake import Snake 
from get_snaxels import get_snaxels; 
import numpy 
import scipy 
from pylab import imread, imshow, gray, mean 
from matplotlib.pyplot import imsave 

alpha = 1.0 
beta = 0.0 
gamma = -10.0 
delta_y = 3 
delta_x = 0 

row_idx = 160 
contour = []; 

count = 0 
for i in range(0, 1000): 
    contour.append((row_idx, i)) 


snaxels, num_snaxels = get_snaxels(contour) 
a = imread('synthesized_kymogram_2.png') 
f = numpy.rot90(a, 2) 
f = numpy.rot90(a, 2) 


snake = Snake(snaxels, alpha, beta, delta_y, delta_x, f, gamma) 
snake.MinimizeEnergy() 

Но, когда я пересмотрю следующее:

from Snaxel import Snaxel 
from Snake import Snake 
from get_snaxels import get_snaxels; 
import numpy 
import scipy 
from pylab import imread, imshow, gray, mean 
from matplotlib.pyplot import imsave 

alpha = 1.0 
beta = 0.0 
gamma = -10.0 
delta_y = 3 
delta_x = 0 

row_idx = 160 
contour = []; 

count = 0 
for i in range(0, 1000): 
    contour.append((row_idx, i)) 


snaxels, num_snaxels = get_snaxels(contour) 
a = imread('20091016_tumor_26_18245948_1chop.png') 

g=ndimage.gaussian_gradient_magnitude(a, 0.4) 

snake = Snake(snaxels, alpha, beta, delta_y, delta_x, g, gamma) 
snake.MinimizeEnergy() 

Я получаю следующее сообщение об ошибке:

if energy < min_energy: 
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

Я думал, что величина градиента будет работать. Но это не так? Кто-нибудь знает, как его решить?

+0

Привет @Carnez, вы можете отредактировать свой вопрос (небольшая серая ссылка внизу вашего вопроса, рядом с комментариями), и я думаю, что было бы лучше разместить эту информацию, так как это не действительно ответ как таковой , – askewchan

Смежные вопросы