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

时间:2012-02-21 04:43:29

标签: c++ image-processing opencv computer-vision edge-detection

我想将OCR应用于墙上7段显示的一些图片。我的策略如下:

  1. 隐蔽Img到灰度
  2. 模糊img以减少假边缘
  3. 将img阈值化为二进制img
  4. 应用Canny Edge检测
  5. 根据数字轮廓给出的模式设置感兴趣区域(ROI)
  6. 缩放投资回报率和模板匹配区域
  7. 如何设置ROI以便我的程序不必在整个图像中查找模板?我希望根据找到的边数设置我的投资回报率,或者如果有人可以帮助我,那么我会更有用。

    我正在研究Cascade Classification和Haar,但我不知道如何将它应用到我的问题中。

    这是预处理和边缘检测后的图像: an image after being pre-processed and edge detected

    原始图片

    enter image description here

2 个答案:

答案 0 :(得分:3)

如果这代表你必须处理的边数,你可以尝试一个很好的天真策略,比如在二进制图像上滑动ROI-finder窗口,它只是对像素值求和,并且不会触发,除非该值高于阈值。这应该优化所有空白表面。

编辑: 好吧一些不太天真的方法。如果您有一些先验知识,就像您知道照片已经很好地对齐(并且没有严重旋转或歪斜),您可以使用低 - 高 - 低 - 高的栅格进行一些通过调整以捕获任何一侧的边缘段,在x和y维度上使用不同的比例。两个方向的良好打击不仅可以提供有关投资回报率的线索,还可以提供开始时的模板规模(过大和过小的格栅不会同时击中两个边缘)。

您可以执行blob检测,然后依次将模板应用于blob(如果模板匹配分数低于阈值,则返回合并blob,以防您的数字段被意外分区)。 blob的大小可能会再次给出一些关于要应用的模板规模的提示。

答案 1 :(得分:0)

首先,假设原始图像具有LED显示,因此照明区域的强度高于背景,我会对原始图像执行Yuv颜色转换,然后使用强度平面(Y)。

接下来,如果您知道图像对齐良好(即未旋转),我建议应用单独的水平和垂直边缘检测器而不是通用边缘检测器(您对对角线不感兴趣)。 E.g。

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

否则,您可以使用轮廓检测​​来查找数字的边界(尽管您可能需要执行扩张来关闭LED段之间的间隙。

接下来,我将构建来自这些边缘或轮廓检测的输出的水平和垂直直方图。这些可以帮助您识别忙碌的'图像中包含许多边缘的区域。

最后,我对Y平面进行阈值处理,并使用我的模板探索每个投资回报率。