python 中的非局部极大值抑制
Non local maxima suppression in python
目标: 输入图像(2d numpy 数组)和 window 大小,并输出相同的数组,保留局部最大值,但其他地方为 0。
我在纠结什么:我想我在我的代码中犯了一个愚蠢的错误,我的循环中可能有一些拼写错误,但我不确定(局部最大值只是在图像的左侧,这是不正确的)。正如我在下面指出的那样,我也欢迎使用 OpenCV 或 numpy 的任何简单技巧来缩短此解决方案。
类似问题:Finding Local Maxima in an Image
和Find local maxima in grayscale image using OpenCV
我的不同,因为:我希望抑制除局部最大值以外的所有值。我不必使用下面的代码,我无法找到 opencv 或 numpy 的内置函数来执行我需要的操作(cv 中的 harris corners 将隐式执行此操作作为步骤之一,但我需要一些东西来执行我需要的唯一操作)。我读了一些关于 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
这可能不完全正确,但在小型测试用例上效果更好
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]
是 select 和 window 的正确方法,而不是 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
这样的事情怎么样:
# Use the max filter to make a mask
roi = 3
size = 2 * roi + 1
image_max = ndimage.maximum_filter(image, size=size, mode='constant')
mask = (image == image_max)
image *= mask
# Remove the image borders
image[:roi] = 0
image[-roi:] = 0
image[:, :roi] = 0
image[:, -roi:] = 0
# Optionally find peaks above some threshold
image_t = (image > peak_threshold) * 1
# get coordinates of peaks
f = np.transpose(image_t.nonzero())
如果峰可能由具有相同像素强度的多个像素组成,则使用 skimage.feature.peak
and center_of_mass
from scipy.ndimage.measurements
中的 peak_local_max
来定位峰中心的不同方法:
from skimage.feature.peak import peak_local_max
from scipy.ndimage.measurements import center_of_mass
from scipy.ndimage import label
from scipy.ndimage.morphology import generate_binary_structure
footprint = generate_binary_structure(3, 3)
peaks = peak_local_max(img, indices=False, footprint=footprint)
lbl, num_features = label(maxima)
centers = center_of_mass(maxima, lbl, range(1, num_features + 1))
values = img[tuple(np.int0(np.transpose(centers)))]
目标: 输入图像(2d numpy 数组)和 window 大小,并输出相同的数组,保留局部最大值,但其他地方为 0。
我在纠结什么:我想我在我的代码中犯了一个愚蠢的错误,我的循环中可能有一些拼写错误,但我不确定(局部最大值只是在图像的左侧,这是不正确的)。正如我在下面指出的那样,我也欢迎使用 OpenCV 或 numpy 的任何简单技巧来缩短此解决方案。
类似问题:Finding Local Maxima in an Image
和Find local maxima in grayscale image using OpenCV
我的不同,因为:我希望抑制除局部最大值以外的所有值。我不必使用下面的代码,我无法找到 opencv 或 numpy 的内置函数来执行我需要的操作(cv 中的 harris corners 将隐式执行此操作作为步骤之一,但我需要一些东西来执行我需要的唯一操作)。我读了一些关于 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
这可能不完全正确,但在小型测试用例上效果更好
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]
是 select 和 window 的正确方法,而不是 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
这样的事情怎么样:
# Use the max filter to make a mask
roi = 3
size = 2 * roi + 1
image_max = ndimage.maximum_filter(image, size=size, mode='constant')
mask = (image == image_max)
image *= mask
# Remove the image borders
image[:roi] = 0
image[-roi:] = 0
image[:, :roi] = 0
image[:, -roi:] = 0
# Optionally find peaks above some threshold
image_t = (image > peak_threshold) * 1
# get coordinates of peaks
f = np.transpose(image_t.nonzero())
如果峰可能由具有相同像素强度的多个像素组成,则使用 skimage.feature.peak
and center_of_mass
from scipy.ndimage.measurements
中的 peak_local_max
来定位峰中心的不同方法:
from skimage.feature.peak import peak_local_max
from scipy.ndimage.measurements import center_of_mass
from scipy.ndimage import label
from scipy.ndimage.morphology import generate_binary_structure
footprint = generate_binary_structure(3, 3)
peaks = peak_local_max(img, indices=False, footprint=footprint)
lbl, num_features = label(maxima)
centers = center_of_mass(maxima, lbl, range(1, num_features + 1))
values = img[tuple(np.int0(np.transpose(centers)))]