感谢你提前阅读。
我正在进行信用卡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
答案 0 :(得分:1)
您应该对图像进行二值化。 findContours
仅适用于图像中只有黑色和白色。
因此,您应该查看图像和阈值中的每个像素。如果它低于某个值使其变黑,则其他明智的变为白色。对我来说,提供的图像看起来也有一些灰色像素。
此外,你应该知道找到轮廓'破坏'提供的图像。它不会自己创建副本。因此,如果你想保留原文,你应该传递一份副本。
找到轮廓后,您可以在原始图像上使用该信息,并更改找到区域中像素的颜色值。
修改:
好的,在我阅读您的更新后,我会建议如下:
使背景,有点蓝色,黑色
为此,您需要检查每个像素并查看颜色值。
如果它有足够的蓝色,则使其变黑 你变成白色的其他东西。
之后你的背景应该是黑色的,你的数字应该是白色的。您现在可以执行findContours,或者如果您只想要数字为黑色并且背景为白色:在二值化过程中反转图像或交换黑白。
重要:强>
你对图像所做的事实上并没有将其二值化。你拿了 颜色。二值化仅指两种颜色。像素将是 黑或白。不是灰色的 您的阈值实际上不是阈值,因为您获取的值(255)是最大值(因为这是您可以使用8位的最高数字)。阈值处理的工作方式不同:对于二进制阈值,您有一个值,低于或等于的所有值都将是一种颜色,上面的所有内容都将是另一种颜色。对于255,整个图像应变为一种颜色....
有了门槛,你通常可以玩一下,直到满足你的需要为止