繁体   English   中英

Python中的非局部最大值抑制

[英]Non local maxima suppression in python

目标:输入图像(2d numpy数组)和窗口大小,并输出相同的数组,并保留局部最大值,但在其他位置为0。

我正在努力解决的问题:我认为我在代码中犯了一个愚蠢的错误,可能是我的循环中有一些错别字,但我不确定(局部最大值仅在图像的左侧,这是不正确的)。 正如我在下面指出的,我也欢迎使用OpenCV或numpy的任何简单技巧来简化此解决方案。

类似的问题: 在图像中查找局部最大值

使用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

这样的事情怎么样:

# 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())

这可能并不完全正确,但是在较小的测试用例中效果更好

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

如果峰值可能包含多个具有相同像素强度的像素,则使用peak_local_max一种方法来使用peak_local_maxskimage.feature.peakcenter_of_massscipy.ndimage.measurements来定位峰值中心:

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)))]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM