我可以做些什么来消除图像的“反射光”?使用OpenCV

时间:2013-06-10 04:14:46

标签: image opencv

我的图像有一个“光反射”,图像上的两个第一个零点与图像的其余部分有一些不同。当我将其转换为二进制图像时,这部分变为白色,我需要获得数字的确切轮廓并且这会阻碍。我可以通过使用OpenCV来解决这个问题吗?

原始图片https://docs.google.com/file/d/0BzUNc6BOkYrNNlE3U04wWEVvVE0/edit?usp=sharing

二进制版本https://docs.google.com/file/d/0BzUNc6BOkYrNeEE0U3NvOElqa1E/edit?usp=sharing

如果我增加阈值,我会丢失图像右侧的数字。我的代码:

#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;

int main ( int argc, char **argv )
{
   Mat im_gray = imread("img2.jpg",CV_LOAD_IMAGE_GRAYSCALE);

   Mat im_rgb  = imread("img2.jpg");
   cvtColor(im_rgb,im_gray,CV_RGB2GRAY);

   Mat img_bw = im_gray > 90;

   imwrite("image_bw2.jpg", img_bw);

   return 0;
}  

2 个答案:

答案 0 :(得分:2)

阴影和眩光不是很容易解决的问题。但是通过一些好的工作,他们有可能克服。

另一个步骤是使用阈值图像作为掩码来获取另一个阈值图像。以下是一些对我有用的标准:

  • 限制除中间体直方图中包含的像素中的所有主要峰值(您现在拥有的)阈值图像
  • 使用导数来查找边界(cvSobel可能有帮助)
  • 使用严格的自适应和自由硬阈值的组合来考虑图像不同部分的不同照明

答案 1 :(得分:1)

实际上问题在你的情况下并不那么困难。因为你只有10个不同的数字,所以训练一些分类器来识别它们。

要快速启动,您可以使用http://blog.damiles.com/2008/11/basic-ocr-in-opencv.html

它会起作用,因为缺陷在某种程度上也会重复。您可以训练算法识别有缺陷的图像,忘记删除这些图像。