如何制作圆形内核?

4

对于以下代码,我想知道如何制作一个圆形内核而不是矩形的。我目前正在查看一些圆形的东西,并且我想找到它的BGR平均值。通过调整我的内核,我的数据将更加准确。

for center in c_1:
    b = img2[center[0]-4: center[0]+5, center[1]-4: center[1]+5, 0]
    g = img2[center[0]-4: center[0]+5, center[1]-4: center[1]+5, 1]
    r = img2[center[0]-4: center[0]+5, center[1]-4: center[1]+5, 2]
4个回答

7

来源: https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_morphological_ops/py_morphological_ops.html

在之前的示例中,我们使用Numpy手动创建了一个结构元素。它是一个矩形形状。但在某些情况下,您可能需要椭圆/圆形形状的核。为此,OpenCV具有一个函数cv2.getStructuringElement()。您只需传递核的形状和大小,即可获得所需的核。

# Elliptical Kernel
>>> cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
array([[0, 0, 1, 0, 0],
       [1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1],
       [0, 0, 1, 0, 0]], dtype=uint8)

3
这个问题具体要求一个圆形核,而不是椭圆形。我在阅读了那些链接文档后来到这里,因为我找不到如何制作真正的圆形核的任何提及。可以清楚地看到,生成的numpy数组在x和y维度上不对称,而这正是人们期望从圆形核中得到的。 - RTbecard
1
你说得对,我承认我过于依赖OpenCV文档作为标准。我认为这个答案(https://dev59.com/l6fja4cB1Zd3GeqPs0K4#47636524)很好地解释了为什么这个结果不是人们期望的。 - Kohanz

5

给定圆心时,可以尝试以下函数获取圆形区域:

def circleAverage(center, r = 4):
    """
    """
    for i in range(center[0]-r, center[0]+r):
        for j in range(center[1]-r, center[1] + r):
            if (center[0] - i) ** 2 + (center[1] - j) ** 2 <= r**2:
                // do your computation here.

希望这能帮到您。

1
我已按以下方式实现它:
r = 16
kernel = np.fromfunction(lambda x, y: ((x-r)**2 + (y-r)**2 <= r**2)*1, (2*r+1, 2*r+1), dtype=int).astype(np.uint8)

需要进行额外的类型转换以避免溢出


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

1

来这里是想找如何制作一个圆形(对称)核函数,结果最终自己实现了。

import numpy as np

def get_circular_kernel(diameter):

    mid = (diameter - 1) / 2
    distances = np.indices((diameter, diameter)) - np.array([mid, mid])[:, None, None]
    kernel = ((np.linalg.norm(distances, axis=0) - mid) <= 0).astype(int)

    return kernel

请注意,对于较小的直径,行为可能是出乎意料的。例如,第二次使用变量mid可以被diameter / 2替换。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接