【问题标题】:Why is the structuring element asymmetric in OpenCV?为什么 OpenCV 中的结构元素不对称?
【发布时间】:2018-05-18 01:13:49
【问题描述】:

为什么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)

这样做的目的是什么?

【问题讨论】:

  • 你应该使用奇数大小的结构元素:例如:ksize(5,5) 如果你希望它围绕中心对称
  • @Miki 谢谢,已更新

标签: opencv image-processing mathematical-morphology image-morphology


【解决方案1】:

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

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

【讨论】:

  • 谢谢;在上述两种情况下,仍然不清楚实际不对称来自何处。 PIL 假设 (0,0) 像素的坐标为 (0.5, 0.5)。也许 CV2 的做法不同,导致了令人惊讶的结果? (AFAICT,这可以解释第一个不对称,但不能解释第二个)
  • OpenCV 没有用于插入亚像素测量值 AFAIK 的标准。我相信如何量化子像素测量值取决于每个函数(因此它是作者)。但是请查看源代码并尝试运行它并打印输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-19
  • 2020-12-09
  • 1970-01-01
  • 1970-01-01
  • 2013-04-14
  • 2013-11-15
相关资源
最近更新 更多