Opencv:在轮廓图像中填充颜色

3
感谢您提前阅读此内容。
我正在进行一项与信用卡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

https://dev59.com/DnI-5IYBdhLWcg3wta1q - LovaBill
1个回答

1
您应该对图像进行二值化。当图像中只有黑色和白色时,findContours才能正常工作。
因此,您应该查看图像中的每个像素并进行阈值处理。如果它低于某个值,则将其变为黑色,否则将其变为白色。对我来说,所提供的图像似乎还有一些灰色像素。
另外,您应该知道,find contours会“破坏”所提供的图像。它不会自己创建副本。因此,如果要保留原始图像,则应传入副本。
在找到轮廓之后,您可以在原始图像上使用该信息并更改找到区域中像素的颜色值。
编辑:
好的,在阅读了您的更新之后,我建议执行以下操作:
将背景(稍微带点蓝色)变为黑色。
为此,您需要检查每个像素并查看颜色值。
如果它有足够的蓝色,则将其变为黑色。
其他所有内容都变为白色。

之后你的背景应该是黑色的,数字应该是白色的。你现在可以使用findContours,或者如果你只想让数字为黑色,背景为白色:反转图像或在二值化过程中交换黑色和白色。

重要提示:
你对图像所做的实际上并不是二值化。你把颜色去掉了。二值化意味着只有两种颜色。一个像素要么是黑色要么是白色。不是灰色。
你的阈值实际上并没有进行阈值处理,因为你取的值(255)是最大值(因为这是8位最高的数字)。阈值处理的工作方式不同: 对于二进制阈值,你有一个值,所有小于或等于该值的都是一种颜色,所有大于该值的都是另一种颜色。对于255,整个图像应该变成一种颜色...
通常你需要调整阈值,直到符合你的需求


非常感谢您的友好建议。实际上,我问题中包含的图像已经被二值化处理了 - 而且我还对图像应用了“自适应阈值化”过程。请查看我更新后的问题以获取更多细节。您能否想到其他解决方法,如何找到轮廓或填充颜色?非常感谢! - Ted
您没有对图像进行二值化处理。它仍然存在灰色像素。 - MentholBonbon
非常感谢您详细的输入...我对图像处理还很陌生。我会按照您的指示尝试一下。 - Ted

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