在OpenCV中进行边缘检测后找到最佳感兴趣区域

10

我希望对墙上的一些7段数码管图片应用OCR技术,我的策略如下:

  1. 将图像转换为灰度
  2. 模糊图像以减少伪边缘
  3. 将图像阈值化为二进制图像
  4. 应用Canny边缘检测
  5. 根据数字轮廓给定的模式设置感兴趣区域(ROI)
  6. 缩放ROI并在区域中进行模板匹配

如何设置ROI,使得我的程序不必在整个图像中查找模板?我想根据发现的边缘数量或其他更有用的东西设置ROI,请帮忙。

我曾经了解过级联分类和Haar,但不知道如何将其应用到我的问题上。

以下是经过预处理和边缘检测后的图像:

经过预处理和边缘检测后的图像

原始图像:

输入图像描述

2
你能同时添加原始图片吗? - Abid Rahman K
2个回答

3
如果这代表您需要处理的边数,可以尝试一种简单的策略,如在二进制图像上滑动ROI查找窗口,它只求和像素值,并且只有在该值高于阈值时才启动。这应该会优化所有空白表面。
编辑: 好的,一些不太幼稚的方法。如果您具有先验知识,例如您知道照片已对齐(而不是旋转或倾斜) ,则可以进行一些通过调整以捕获段两侧的边缘的低高低高栅格的传递,使用x和y维度中的不同比例尺度。在两个方向上都有良好的命中将不仅提供ROI的线索,还会提供从哪个模板开始使用的比例尺度的线索(太大和太小的栅格无法同时击中两个边缘)。
您可以进行斑点检测,然后依次将模板应用于斑点(如果模板匹配分数低于阈值,则回退到合并斑点,以防意外分区号码片段)。斑点的大小可能再次为您提供一些有关应用模板比例尺度的提示。

这是我的原始计划之一。我想看看是否有更成熟的方案可以帮助我。 - locorecto

0

首先,考虑到原始图像具有LED显示屏,因此发光区域的亮度高于其余区域,我会对原始图像执行Yuv色彩转换,然后在强度平面(Y)上进行处理。

接下来,如果您知道图像已经对齐(即没有旋转),我建议应用单独的水平和垂直边缘检测器,而不是通用的边缘检测器(您不关心对角线)。例如:

 sobelx = cv2.Sobel( img, cv2.CV_64F, 1, 0, ksize=5 )
 sobely = cv2.Sobel( img, cv2.CV_64F, 0, 1, ksize=5 )

否则,您可以使用轮廓检测来查找数字的边界(虽然您可能需要执行扩张操作以关闭LED段之间的间隙)。
接下来,我会构建从这些边缘或轮廓检测的输出中得出的水平和垂直直方图。这些将帮助您识别包含许多边缘的“繁忙”图像区域。
最后,我会对Y平面进行阈值处理,并使用我的模板探索每个感兴趣区域。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接