3

为什么 OpenCV 中的结构元素不对称?

cv2.getStructuringElement(cv2.MORPH_ELLIPSE, ksize=(4,4))

返回

array([[0, 0, 1, 0],
       [1, 1, 1, 1],
       [1, 1, 1, 1],
       [1, 1, 1, 1]], dtype=uint8)

为什么不是

array([[0, 1, 1, 0],
       [1, 1, 1, 1],
       [1, 1, 1, 1],
       [0, 1, 1, 0]], dtype=uint8)

反而?

奇数大小的结构元素在 90 度旋转方面也是不对称的:

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)

这样做的目的是什么?

4

1 回答 1

3

除了它是这种形状的许多可能的插值之一之外,它没有任何目的。在大小为 5 的椭圆的情况下,如果它是满的,它将与 相同MORPH_RECT,如果从侧面移除相同的两个,就像从顶部移除一样,它将是一个菱形。无论哪种方式,它在源代码中的实际实现方式都是您所期望的——它通过距离函数创建一个圆,并采用接近整数来获取二进制像素。搜索那个文件cv::getStructuringElement,你会找到实现,没什么太花哨的。

如果您认为应该对此功能进行更新,请在 GitHub 上打开一个 PR 并提供已实现的版本,或者先讨论一个问题。我认为成功的贡献在这里很容易,我敢说对称的理由很充分。人们会期望使用椭圆内核处理对称图像的结果将不依赖于图像的方向。

于 2017-12-04T15:20:49.177 回答