我是python的新手。我试图将图像读入多维numpy数组并计算渐变的大小,这应该产生单个通道图像。然而,我计算幅度后的尺寸是700 x 900.任何人都可以帮我格式化数据,所以我可以收到单个频道图像吗?
a = imread('20091016_tumor_26_18245948_1chop.png')
ndimage.gaussian_gradient_magnitude(a, 0.4, a)
答案 0 :(得分:2)
我认为人们对你的术语感到困惑。单通道图像 是2D阵列...,多通道图像将是3D阵列(存储每个通道的额外维度)。例如,单个通道图像将是灰度,但多通道将是彩色的。有关详细信息,请参阅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)
由于渐变本身是一个矢量,它实际上将添加到维度中,因此二维图像变为一个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)
答案 1 :(得分: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()
我认为梯度的大小会起作用。但是,它不是吗?有谁知道如何解决它?