取决于上一个轴的索引的数组切片最大值

2024-09-27 23:26:51 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我有一个很大的2D数组,来自tiff图像,我想在其中计算质心。为此,我使用图像的索引(作为坐标)和平均函数:

from PIL import Image
from numpy import *

Im    = Image.open("32bit_grayscale.tif")
imArr = array(Im, dtype='float32')
indx  = indices(imArr.shape)

cenMassX = average(indx[0,:,:],weights=imArr[:,:])
cenMassY = average(indx[1,:,:],weights=imArr[:,:])

在其他一些类似的图像中,有两个独立的质心,我想计算。两个计算区域用一条直线隔开,我有它的方程。在

我想再次使用average方法,因为它非常有效,但是我需要将indx数组第二个轴的切片的最大值设置为当前第一个轴值的函数。如果行是y=slope*x+interY,那么我需要这样的内容:

^{pr2}$

其中row表示第一个轴索引(“x”轴)的当前值。忽略这个事实,我可以离开数组的极限,这取决于方程。在

我可以使用for循环来实现这一点,但它的效率非常低(只有原来的20倍),也不是非常“python”:

cenMassX_A = 0
cenMassY_A = 0
cumSum     = 0
for row in range(0,imArr.shape[0]):
    for col in range(0,int(round(slope*row+interY))):
        cenMassX_A += row*imArr[row,col]
        cenMassY_A += col*imArr[row,col]
        cumSum     += imArr[row,col]
cenMassX_A /= cumSum
cenMassY_A /= cumSum

cenMassX_B = 0
cenMassY_B = 0
cumSum     = 0
for row in range(0,imArr.shape[0]):
    for col in range(int(round(slope*row+interY)),imArr.shape[1]):
        cenMassX_B += row*imArr[row,col]
        cenMassY_B += col*imArr[row,col]
        cumSum     += imArr[row,col]
cenMassX_B /= cumSum
cenMassY_B /= cumSum

那么,有没有一种方法可以做到这一点,还是我一直在使用for循环?我一直在读关于面具和滚动窗户的文章,但仍然没有找到解决办法。 提前谢谢!在


Tags: in图像forrangecol数组sloperow
2条回答

为什么不使用你写的代码:

cenMassX_A = average(indx[0,:,:slope*row+interY],weights=inArr[:,:slope*row+interY])
cenMassY_A = average(indx[1,:,:slope*row+interY],weights=inArr[:,:slope*row+interY])

按行应用?在

将for循环保留在行上,但用以下代码替换col循环(将行索引从所有行更改为只在for循环中的行索引)。当然,您仍然需要将这些行的结果相加。在

如果将imArr[i,j]=0设置为直线一侧或另一侧的所有点,会发生什么情况?这是最简单的掩蔽方法。在

I = indx[0,...]*slope + indx[1,...]>=M
imArr1 = imArr.copy()
imArr1[I]=0
print np.average(indx[0,...],weights=imArr1)
print np.average(indx[1,...],weights=imArr1)

imArr1 = imArr.copy()
imArr1[~I]=0

print np.average(indx[0,...],weights=imArr1)
print np.average(indx[1,...],weights=imArr1)

如果我取一个简单的“图像”,并将它连接到它自身(水平或对角)上,这就很好了。在

相关问题 更多 >

    热门问题