Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Opencv:在轮廓图像中填充颜色_C++_Python_Objective C_Opencv_Image Processing - Fatal编程技术网

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

C++ Opencv:在轮廓图像中填充颜色,c++,python,objective-c,opencv,image-processing,C++,Python,Objective C,Opencv,Image Processing,谢谢你提前阅读 我正在做一个与信用卡OCR相关的项目,其中一个步骤需要对一个已经轮廓化的图像填充颜色 示例图像包括: 我的目标是填补空白: 虽然看起来很简单,但我没有找到令人满意的解决方案 我正在尝试findContours函数,但我发现它非常混乱。运行以下功能后: findContours( cvMatImage, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cv::Point(0, 0) ); 奇怪的是,不仅没有

谢谢你提前阅读

我正在做一个与信用卡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

你应该对图像进行二值化
findContours
仅在图像中只有黑色和白色时才能正常工作

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

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

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

编辑:

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

如果里面有足够的蓝色,就把它变成黑色。
你做的其他东西都是白色的

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

重要提示:
您对图像所做的实际上并不是对其进行二值化。你拿了 涂上颜色。二值化表示只有两种颜色。一个像素可以是 黑色或白色。不是灰色。
您的阈值实际上不是阈值,因为您获取的值(255)是最大值(因为这是8位的最大值)。阈值处理的工作原理不同:对于一个二进制阈值,如果你有一个值,那么低于或等于该值的所有颜色都将是一种颜色,高于该值的所有颜色都将是另一种颜色。对于255,整个图像应变成一种颜色……
有了阈值,你通常会玩一玩,直到它们满足你的需要


非常感谢你的好意。事实上,我的问题中包含的图像已经进行了二值化——我还对图像应用了“自适应阈值”过程。请查看更新的问题以了解我的详细信息。你能想出其他的解决办法吗,关于如何找到轮廓或如何填充颜色?谢谢!您没有对图像进行二值化。里面仍然有灰色像素。非常感谢您的详细输入。。。我是图像处理方面的新手。我会按照你的指示来试一下。谢谢!我来看看。