Python 多维数组与梯度大小

Python 多维数组与梯度大小,python,image,numpy,Python,Image,Numpy,我是python新手。我试图将一幅图像读入多维numpy数组,并计算梯度的大小,这应该会生成一幅单通道图像。然而,在我计算震级后的尺寸是700 x 900。有人能帮我格式化数据,这样我就可以接收单通道图像了吗 a = imread('20091016_tumor_26_18245948_1chop.png') ndimage.gaussian_gradient_magnitude(a, 0.4, a) 我认为人们对你的术语感到困惑。单通道图像是2D阵列…,多通道图像是3D阵列(存储每个通道的额

我是python新手。我试图将一幅图像读入多维numpy数组,并计算梯度的大小,这应该会生成一幅单通道图像。然而,在我计算震级后的尺寸是700 x 900。有人能帮我格式化数据,这样我就可以接收单通道图像了吗

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

我认为人们对你的术语感到困惑。单通道图像是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
的矩阵版本,
a
b
都是相同的形状。一维或二维阵列的内积或点积的输出与右侧宽度相同,与左侧高度相同,因此两个方阵构成一个方阵

以下是一些例子:

a = Image.open('kinglet_bw.jpg')
plt.imshow(a)


这种方法有两种版本:

第一个有效:

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()
如果能量<最小能量:
ValueError:包含多个元素的数组的真值不明确。使用a.any()或a.all()

我认为梯度的大小会起作用。但事实并非如此?有人知道如何解决它吗?

梯度的大小将在每个像素处计算,因此您的结果与输入图像的大小相同。sobel运算符上的wiki artcile可能会让您更深入地了解预期结果:但是,是否有任何python参考来正确计算它以接收单通道图像?我认为您需要进一步阐述您的问题。numpy数组是2D还是3D(我假设您在.png中阅读时是3D)?您需要2D输出阵列吗?您想要每个通道的渐变吗?等等。我的numpy数组是3D的,我希望从imageHi@Carnez的幅度梯度中得到一个单通道图像(标量),你可以编辑你的问题(问题底部的一个小灰色链接,靠近评论),我认为这将是一个更好的放置这些信息的地方,因为它本身并不是一个真正的答案。
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()