【问题标题】:Opencv: Fill color in a contoured imageOpencv:在轮廓图像中填充颜色
【发布时间】:2013-04-23 16:11:18
【问题描述】:

感谢您提前阅读。

我正在做一个与信用卡 OCR 相关的项目,其中一个步骤需要为已经轮廓化的图像填充颜色。

示例图片包括:

我的目标是用黑色填充空白:

虽然看起来很简单,但我没有找到令人满意的解决方案。

我正在尝试findContours 函数,但我发现它非常混乱。运行以下函数后:

findContours( cvMatImage, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cv::Point(0, 0) );

奇怪的是,不仅轮廓点没有被正确提取,而且原始输入图像似乎有自己的颜色反转。

非常感谢任何有关我应该如何完成目标或如何正确使用findContours 函数的意见。

更新:

非常感谢您的热心意见。

事实上,我的问题中包含的图像已经二值化了——而且我还对图像应用了“自适应阈值”程序。

原图如下:http://i.stack.imgur.com/DkIKt.png

CGColorSpaceRef colorSpace = CGImageGetColorSpace(self.CGImage);
CGFloat cols = self.size.width;
CGFloat rows = self.size.height;

Mat cvMat(rows, cols, CV_8UC4); // 8 bits per component, 4 channels

CGContextRef contextRef = CGBitmapContextCreate(cvMat.data,                 // Pointer to  data
                                                cols,                       // Width of bitmap
                                                rows,                       // Height of bitmap
                                                8,                          // Bits per component
                                                cvMat.step[0],              // Bytes per row
                                                colorSpace,                 // Colorspace
                                                kCGImageAlphaNoneSkipLast |
                                                kCGBitmapByteOrderDefault); // Bitmap info flags
CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), self.CGImage);
CGContextRelease(contextRef);
CGColorSpaceRelease(colorSpace);

Mat cvImage_gray, cvImage_threshold;

cvtColor(cvImageOrg, cvImage_gray, CV_RGB2GRAY); //Binarize

adaptiveThreshold(cvImage_gray, cvImage_threshold, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, neighbor, threshRed); //Adaptive threshold

【问题讨论】:

标签: c++ python objective-c opencv image-processing


【解决方案1】:

您应该对图像进行二值化。 findContours 仅在存在例如图像中只有黑白。

因此,您应该查看图像中的每个像素和阈值。如果它低于某个值,则将其设为黑色,否则将其设为白色。对我来说,提供的图像看起来也有一些灰色像素。

您还应该知道,查找轮廓会“破坏”提供的图像。它不会自行创建副本。所以如果你想保留原件,你应该传递一份副本。

找到轮廓后,您可以在原始图像上使用该信息并更改找到区域中像素的颜色值。

编辑:

好的,在我阅读您的更新后,我会推荐以下内容:
将带蓝色的背景设置为黑色。
为此,您需要检查每个像素并查看颜色值。

如果里面有足够的蓝色,就让它变黑。
你做的其他一切都是白色的。

之后,您的背景应为黑色,数字应为白色。您现在可以使用 findContours,或者如果您只希望数字为黑色而背景为白色:反转图像或在二值化过程中交换黑白。

重要提示:
您对图像所做的实际上并没有将其二值化。你拿了 上色。二值化意味着只有两种颜色。一个像素将是 黑或白。不是灰色的。
您的阈值实际上不是阈值,因为您采用的值 (255) 是最大值(因为这是 8 位可以拥有的最高数字)。阈值的工作方式不同:对于二进制阈值,您有一个值,低于或等于的所有内容都将是一种颜色,高于或等于的所有内容将是另一种颜色。对于 255,整个图像应该变成一种颜色....
使用阈值,您通常会玩一些,直到它们满足您的需求

【讨论】:

  • 非常感谢您的热心意见。事实上,我的问题中包含的图像已经被二值化了——我还对图像应用了“自适应阈值”程序。有关我的详细信息,请参阅更新后的问题。你能想到任何其他解决方法,如何找到轮廓或如何填充颜色?非常感谢!
  • 您没有对图像进行二值化。里面还有灰色像素。
  • 非常感谢您的详细输入...我是图像处理方面的新手。我会按照您的指示尝试一下。
猜你喜欢
  • 1970-01-01
  • 2014-11-26
  • 1970-01-01
  • 2012-11-06
  • 1970-01-01
  • 2013-10-13
  • 2016-10-21
  • 2013-07-16
相关资源
最近更新 更多