Python/OpenCV:如何从图像数据中推断出最佳结构元素?

Posted

技术标签:

【中文标题】Python/OpenCV:如何从图像数据中推断出最佳结构元素?【英文标题】:Python/OpenCV: How can I infer an optimal structuring element from image data? 【发布时间】:2018-04-20 14:13:01 【问题描述】:

我有一个已拍摄的二维黑白/二进制条形码样本。

(彩色)照片通常会遇到所有常见的问题:模糊、失真、对比度问题/照明渐变和腐蚀。

我正在尝试重建原始条形码,它们曾经是计算机生成的黑/白值像素阵列。

我们应该能够利用图像的空间频率信息来推断每个像素的尺寸。希望通过将图像与数据定义的这种结构元素进行卷积来更好地还原原始图像。

虽然这是一个非常广泛的话题,但我有一个非常具体的问题:

在不使用先验知识的情况下,在 OpenCV/Python 中从图像数据建立结构化元素的最佳方法是什么?

(现在假设底层像素尺度是空间不变的一些很好的近似)

请注意,我并不是要尝试执行整个提取管道:这个问题只是关于从数据中推断出最佳结构元素。

例如,空间内核可以用作不锐化蒙版的输入,例如 Python unsharp mask

参考资料:

(一维创意)http://answers.opencv.org/question/174384/how-to-reconstruct-damaged-barcode, http://www.windytan.com/2016/02/barcode-recovery-using-priori.html

(类似想法)Finding CheckerBoard Points in opencv for any random ChessBoard( pattern size not known)

(有点但不是真的,而且没有回答)OpenCV find image frequencies

(广泛)https://en.wikipedia.org/wiki/Chessboard_detection

【问题讨论】:

【参考方案1】:

这样做的一种方法是:

    计算 x 和 y 方向上的 Scharr gradient 幅度表示。 从 x 梯度中减去 y 梯度。通过执行这种减法,我们会留下具有高水平梯度和低垂直梯度的图像区域。 对图像进行模糊处理和阈值化以滤除噪点。 对阈值图像应用关闭内核以关闭条形码垂直条纹之间的间隙。 执行一系列膨胀和腐蚀。 找到图像中最大的轮廓,现在大概是条形码。

更多细节和完整代码可以在this PyImageSearch blog post找到。

【讨论】:

谢谢 - 我不是要进行完整的端到端条形码提取,而是简单地确定用于恢复像素的最佳结构元素。请注意,条形码是二维的,因此不一定会出现 x-y 不对称。

以上是关于Python/OpenCV:如何从图像数据中推断出最佳结构元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何在图像时间序列中一致地对轮廓进行编号?

Python+OpenCV图像处理(十四)—— 直线检测

从模糊的书写中推断出字母(例如车牌)?

Python+OpenCV图像处理之直线检测

如何在 Python OpenCV 中读取 TIFF 图像的 alpha 通道?

如何使用python opencv删除文件夹中的特定图像