Goal:输入图像(2d numpy 数组)和窗口大小,并输出相同的数组,其中保留局部最大值,但其他地方为 0。
我正在挣扎的是:我认为我在代码中犯了一个愚蠢的错误,也许我的循环中有一些拼写错误,但我不确定(局部最大值仅位于图像的左侧,这是不正确的)。正如我在下面指出的,我也欢迎任何使用 OpenCV 或 numpy 的简单技巧来缩短这个解决方案。
类似问题:寻找图像中的局部最大值 https://stackoverflow.com/questions/23680073/finding-local-maxima-in-an-image
and 使用 OpenCV 查找灰度图像中的局部最大值 https://stackoverflow.com/questions/5550290/find-local-maxima-in-grayscale-image-using-opencv?rq=1
我的不一样,因为:我希望抑制除局部最大值之外的所有内容。我不必使用下面的代码,我无法找到 opencv 或 numpy 的内置函数来完成我需要做的事情(cv 中的哈里斯角将隐式执行此操作作为步骤之一,但我需要一些东西来执行我需要的唯一操作)。我读了一些关于 dilate 的内容,不确定这在这里是否也有用。
到目前为止我已经尝试过的。
def nonMaximalSupress(image,NHoodSize):
#For
for x in range(0,image.shape[0]-1):
if x+NHoodSize[0]<image.shape[0]:
#while we can still take a square
#print "AHH ", image.shape
startWindow=0
for y in range(startWindow,image.shape[1]-NHoodSize[1]):
#try:
if np.sum(image[x:x+NHoodSize[0]][y:y+NHoodSize[1]])==0:
localMax=0
else:
localMax = np.amax(image[x:x+NHoodSize[0]][y:y+NHoodSize[1]])
#except ValueError:
#localMax=0
#print "local max is ", localMax
maxCoord=np.unravel_index(np.argmax((image[x:x+NHoodSize[0],y:y+NHoodSize[1]])),
image.shape)+np.array((x,y))
#print "X is %r, Y is %r, max coord is %r \n y+nhood is %r" %(x,y,maxCoord,y+NHoodSize[1])
#suppress everything
image[x:x+NHoodSize[0]][y:y+NHoodSize[1]]=0
#reset only the max
#print maxCoord
if localMax > 0:
print localMax
print "max coord is ", maxCoord[0], maxCoord[1]
image[maxCoord[0]][maxCoord[1]]=localMax
#increment y
x+=NHoodSize[0]
return image