0

我是 python 新手。我正在尝试将图像读入多维 numpy 数组并计算梯度的大小,这应该会产生单通道图像。但是,计算幅度后的尺寸是 700 x 900。谁能帮我格式化数据,以便我可以接收单通道图像?

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

2 回答 2

2

我认为人们对你的术语感到困惑。单通道图像2D 数组...,多通道图像将是 3D 数组(存储每个通道的额外维度)。例如,单通道图像是灰度的,但多通道图像是彩色的。有关详细信息,请参阅频道(数字图像)

如果您想要标量输出,则必须更具体地说明如何将图像减少为标量。一个简单的例子是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 Here 的矩阵版本,a并且b都是相同的形状。一维或二维数组的内积或点积的输出与右侧的宽度相同,与左侧的高度相同,因此两个方阵给出一个方阵。

这里有些例子:

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)

g2

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

G

于 2013-11-08T15:13:07.473 回答
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()

我认为梯度的大小会起作用。但是,不是吗?有谁知道如何解决它?

于 2013-11-08T15:49:58.827 回答