【问题标题】:OpenCV: Detect a black to white gradient in an areaOpenCV:检测区域中的黑白渐变
【发布时间】:2010-08-04 14:45:08
【问题描述】:
我上传了一张示例图片以便更好地理解:http://www.imagebanana.com/view/kaja46ko/test.jpg
在图像中,您可以看到一些扫描线和一个标记(带有圆圈的白色矩形)。我希望 OpenCV 沿着应该在 5x5 左右的指定区域(在通过扫描线概述的示例中)进行。如果该区域包含从黑色到白色的渐变,我希望 OpenCV 保存该区域的位置,以便以后使用它。
最终的结果是区分标记和其他通过黑白线分隔的矩形。
这样的事情可能吗?我用谷歌搜索了很多,但我只找到了边缘检测器,但这不是我想要的,我真的只需要检测黑白渐变。
提前致谢。
【问题讨论】:
标签:
opencv
augmented-reality
convolution
photogrammetry
【解决方案1】:
最好通过计算直方图来过滤掉一些区域。
您可以将 cvCalcHist 用于该任务,然后您可以建立一些阈值来确定黑白像素百分比是否对应于渐变的百分比。这不会解决任务,但会帮助您降低复杂性。
然后,您可以侵蚀图像以合并所有白色区域。应用阈值后,可以找到连接组件(使用 cvFindContours)将图像分隔在黑色区域或白色区域中。然后,您可以通过查找同时包含一块白色区域和黑色区域的 5x5 区域来检测渐变。
希望对您有所帮助。
【解决方案2】:
感谢您的回答者 dnul,但这并没有真正帮助我解决这个问题。我想用直方图来解决问题,但这并不是我想要的。
我通过创建一个 40x40 矩阵解决了这个问题,该矩阵包含 5x5 矩阵,其中包含所有 3 个通道中的原始像素数据。我迭代了每个 40px 区域,并在内部迭代了 5px 区域的每个边界。我检查了每个像素并将比某个阈值更暗的像素保存为存储。
在迭代之后,我大致了解了它们有多少黑色像素,因此我检查了它们中的每一个,以查找所有 3 个通道中具有白色像素的邻居。然后我标记了每个像素并将它们保存到另一个存储中。
然后我使用 ransac 算法从这些点构造线。它为每个标记边缘构建大约 5-20 条线。然后我查看了彼此相交的线条,并保存了那些以直角相交的线条的位置。
我从中得到的 4 个点是标记的边缘。
如果您想重现这种情况,您必须事先过滤图像并应用阈值,以便更容易区分黑白像素。
示例图片,在找到点之后和构建线之前保存:
http://www.imagebanana.com/view/i6gfe6qi/9.jpg