为什么 OpenCV 中的结构元素是不对称的?
Why is the structuring element asymmetric in OpenCV?
为什么OpenCV中的结构元素不对称?
cv2.getStructuringElement(cv2.MORPH_ELLIPSE, ksize=(4,4))
returns
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)
这样做的目的是什么?
它没有目的,除了它是这种形状的许多可能插值之一。在大小为 5 的椭圆的情况下,如果它是完整的,它将与 MORPH_RECT
相同,如果从侧面和顶部移除相同的两个,它将是一个菱形。无论哪种方式,它实际实现的方式 in the source code 都是您所期望的——它通过距离函数创建一个圆,并采用接近整数来获取二进制像素。在该文件中搜索 cv::getStructuringElement
,您会找到实现,这没什么特别的。
如果您认为应该对此功能进行更新,请在 GitHub 上使用已实现的版本打开一个 PR,或者先讨论一个问题。我认为在这里做出成功的贡献很容易,而且我敢打赌对称性的理由很充分。人们会期望用椭圆核处理对称图像的结果不依赖于图像的方向。
为什么OpenCV中的结构元素不对称?
cv2.getStructuringElement(cv2.MORPH_ELLIPSE, ksize=(4,4))
returns
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)
这样做的目的是什么?
它没有目的,除了它是这种形状的许多可能插值之一。在大小为 5 的椭圆的情况下,如果它是完整的,它将与 MORPH_RECT
相同,如果从侧面和顶部移除相同的两个,它将是一个菱形。无论哪种方式,它实际实现的方式 in the source code 都是您所期望的——它通过距离函数创建一个圆,并采用接近整数来获取二进制像素。在该文件中搜索 cv::getStructuringElement
,您会找到实现,这没什么特别的。
如果您认为应该对此功能进行更新,请在 GitHub 上使用已实现的版本打开一个 PR,或者先讨论一个问题。我认为在这里做出成功的贡献很容易,而且我敢打赌对称性的理由很充分。人们会期望用椭圆核处理对称图像的结果不依赖于图像的方向。