在 python 和 openCV 中实现 LoG blob 检测器

Implementing LoG blob detector in python and openCV

我正在尝试根据维基百科中的算法实现 LoG blob 检测器: https://en.wikipedia.org/wiki/Blob_detection#The_Laplacian_of_Gaussian

我正在使用 Python 和 openCV,我正在使用我获得的用于制作滤镜的代码,我的代码创建了 n 级滤镜,在图像上使用滤镜并将所有级别保存在一个 hwn 数组。 之后我寻找局部最大值,如果找到一个,我将其标记为斑点的中心并在其周围画一个圆圈。 我设法让它工作,但我得到了奇怪的结果,我不确定我做错了什么。

myImage = cv2.imread('fishes.jpg')
n = 15
height, width = myImage.shape[:2]
empty = np.empty((height+2,width+2)).astype(np.uint8)
imgArray = np.empty((n+2,height+2,width+2)).astype(np.uint8)
radArray = []
imgArray[0] = empty
imgArray[n+1] = empty
gray_image = cv2.cvtColor(myImage, cv2.COLOR_BGR2GRAY)
grayAllChannels = cv2.cvtColor(gray_image, cv2.COLOR_GRAY2BGR)
sigma = 2
k = 2**(0.25)
std2 = float(sigma**2)
for i in range(n):
    filt_size =  2*np.ceil(3*sigma)+1
    radArray.append(filt_size / 2)
    H = log_filt( filt_size, sigma)
    H *= sigma**2
    dst = cv2.filter2D(gray_image,-1,H)
    dst = cv2.copyMakeBorder(dst,1,1,1,1,cv2.BORDER_CONSTANT, value=BLACK)
    imgArray[i+1] = dst      
    sigma = sigma * k
    std2 = float(sigma**2)

i = 0
for imgIndex in range(1,n+1):
    for hIndex in range(1, height+1):
        for wIndex in range(1, width+1):
            tSlice = imgArray[imgIndex - 1:imgIndex + 2,hIndex - 1:hIndex + 2,wIndex - 1:wIndex + 2]
            tNum = imgArray[imgIndex,hIndex,wIndex]
            if (tNum > imgArray[imgIndex - 1,hIndex - 1,wIndex - 1] and
                tNum > imgArray[imgIndex - 1,hIndex - 1,wIndex] and
                tNum > imgArray[imgIndex - 1,hIndex - 1,wIndex + 1] and
                tNum > imgArray[imgIndex - 1,hIndex,wIndex - 1] and
                tNum > imgArray[imgIndex - 1,hIndex,wIndex] and
                tNum > imgArray[imgIndex - 1,hIndex,wIndex + 1] and
                tNum > imgArray[imgIndex - 1,hIndex + 1,wIndex - 1] and
                tNum > imgArray[imgIndex - 1,hIndex + 1,wIndex] and
                tNum > imgArray[imgIndex - 1,hIndex + 1,wIndex + 1] and

                tNum > imgArray[imgIndex,hIndex - 1,wIndex - 1] and
                tNum > imgArray[imgIndex,hIndex - 1,wIndex] and
                tNum > imgArray[imgIndex,hIndex - 1,wIndex + 1] and
                tNum > imgArray[imgIndex,hIndex,wIndex - 1] and
                tNum > imgArray[imgIndex,hIndex ,wIndex + 1] and
                tNum > imgArray[imgIndex,hIndex + 1,wIndex - 1] and
                tNum > imgArray[imgIndex,hIndex + 1,wIndex] and
                tNum > imgArray[imgIndex,hIndex + 1,wIndex + 1] and

                tNum > imgArray[imgIndex + 1,hIndex - 1,wIndex - 1] and
                tNum > imgArray[imgIndex + 1,hIndex - 1,wIndex] and
                tNum > imgArray[imgIndex + 1,hIndex - 1,wIndex + 1] and
                tNum > imgArray[imgIndex + 1,hIndex,wIndex - 1] and
                tNum > imgArray[imgIndex + 1,hIndex,wIndex] and
                tNum > imgArray[imgIndex + 1,hIndex,wIndex + 1] and
                tNum > imgArray[imgIndex + 1,hIndex + 1,wIndex - 1] and
                tNum > imgArray[imgIndex + 1,hIndex + 1,wIndex] and
                tNum > imgArray[imgIndex + 1,hIndex + 1,wIndex + 1]):

                cv2.circle(grayAllChannels,(hIndex - 1, wIndex - 1),np.int16(radArray[imgIndex - 1]),(0,30,230),2)

我得到这个结果:

正确的结果应该是这样的:

知道我做错了什么吗?

有没有可能你把column/row分别y/x搞混了(图片右半边没有斑点)? 如果我猜的话,我会在画圆圈的时候说。我认为你必须以(x, y)的格式传递积分,这意味着你必须交换你的价值。