目标:输入图像(2d numpy数组)和窗口大小,并输出相同的数组,并保留局部最大值,但在其他位置为0。
我正在努力解决的问题:我认为我在代码中犯了一个愚蠢的错误,可能是我的循环中有一些错别字,但我不确定(局部最大值仅在图像的左侧,这是不正确的)。正如我在下面指出的,我也欢迎使用OpenCV或numpy的任何简单技巧来简化此解决方案。
类似的问题:Finding Local Maxima in an Image
和Find local maxima in grayscale image using OpenCV
我的与众不同是因为:我希望压制除局部最大值以外的所有值。我不必在下面使用我的代码,也无法找到内置函数opencv或numpy来完成所需的操作(cv中的Harris角落将隐式地将其作为步骤之一,但我需要执行我所需的唯一操作)。我读了一些关于扩张的内容,不确定在这里是否也有用。
到目前为止我尝试过的。
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
python大神给出的解决方案
这可能并不完全正确,但是在较小的测试用例中效果更好
def nonMaximalSupress1(image,NHoodSize):
#
dX, dY = NHoodSize
M, N = image.shape
for x in range(0,M-dX+1):
for y in range(0,N-dY+1):
window = image[x:x+dX, y:y+dY]
if np.sum(window)==0:
localMax=0
else:
localMax = np.amax(window)
maxCoord=np.unravel_index(np.argmax(window), window.shape) + np.array((x,y))
#suppress everything
image[x:x+dX, y:y+dY]=0
#reset only the max
if localMax > 0:
print localMax
print "max coord is ", maxCoord
image[tuple(maxCoord)] = localMax
return image
我使用局部变量使内容更易于阅读,并调整了循环范围。但是最大的变化是我如何索引image
。特别是在使用切片索引时,必须使用一组括号。
image[x:x+dX, y:y+dY]
是选择窗口的正确方法,而不是image[x:x+dX][y:y+dY]
。
可以通过修改window
将其清除得更多。由于它是view
,因此对其进行更改会更改image
。
def nonMaximalSupress2(image,NHoodSize):
#
dX, dY = NHoodSize
M, N = image.shape
for x in range(0,M-dX+1):
for y in range(0,N-dY+1):
window = image[x:x+dX, y:y+dY]
if np.sum(window)==0:
localMax=0
else:
localMax = np.amax(window)
maxCoord = np.argmax(window)
# zero all but the localMax in the window
window[:] = 0
window.flat[maxCoord] = localMax
return image