6

我的图像有一个“光反射”,图像上的两个第一个零与图像的其余部分有一些不同的光。当我将其转换为二进制图像时,这部分会变成白色,我需要获得数字的确切轮廓,这会阻碍。我可以通过使用 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;
}  
4

2 回答 2

2

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

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

  • 限制中间(您现在拥有的)阈值图像的直方图中包含的像素中除主峰之外的所有像素
  • 使用导数找到边界(cvSobel 可能有帮助)
  • 使用严格自适应和自由硬阈值的组合来考虑图像不同部分的变化照明
于 2013-06-10T11:00:48.137 回答
1

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

为了快速入门,您可以使用http://blog.damiles.com/2008/11/basic-ocr-in-opencv.html

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

于 2014-04-28T03:15:26.877 回答