2012-04-21 104 views
0

我的目标是从扫描的名片图像中删除任何非文本区域,但我不知道使用OpenCV执行该操作的步骤,我已按照此步骤操作但不知道这是正确的还是不是我也没有注意到图像中的任何变化(非文本区域仍然存在),任何想法都将非常有帮助,谢谢。如何使用OpenCV从名片中删除非文本区域?

1)将图像转换为灰度

2)二进制文件图像

3)反转,以便具有一个白色像素文本

4的颜色(CV :: bitwise_not))侵蚀图像(CV ::侵蚀)

5)使用检测的边缘的Canny

6)使用hough变换(尚未检测文本行)

代码:

cv::Mat greyMat = [self.imageView.image CVGrayscaleMat]; 
cv::Mat bwMat; 
cv::threshold(greyMat, bwMat, 128, 255, CV_THRESH_BINARY); 
cv::bitwise_not(bwMat, bwMat); 
cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(2, 1)); 
cv::erode(bwMat, bwMat, element); 
std::vector<cv::Point>points; 
cv::Mat_<uchar>::iterator it=bwMat.begin<uchar>(); 
cv::Mat_<uchar>::iterator end=bwMat.end<uchar>(); 
for (; it!=end; ++it) 
if (*it) 
points.push_back(it.pos()); 
cv::RotatedRect box=cv::minAreaRect(cv::Mat(points)); 
plImage* smothedImage=new IplImage(bwMat); 
cvSmooth(smothedImage, smothedImage); 
cvCanny(smothedImage, smothedImage, 10, 100); 
+4

你尝试过什么?你可以尝试缩小你的问题的具体内容,否则我想这将被关闭为“非建设性的” – 2012-04-21 00:11:53

+1

我更新了我的问题 – chostDevil 2012-04-21 11:49:38

+0

请提供一个样本图像,以及@PatrickJones – karlphillip 2012-04-21 14:25:10

回答

6

一种方式来定义的标志可能是标志部分包含除文本部分胖的线条和较大的斑点。

如果成立,你可以删除的标志是这样的:

(我用的ImageMagick生成以下样品,你应该能够与OpenCV的相同)

0)阈值图片(可选)

imagemagick: convert img0052ir.jpg -threshold 60% monochrome.png 

output of: convert img0052ir.jpg -threshold 60% monochrome.png

1)扩张的影像,直到所有字母都消失了,但标识的某些部分仍然保持。

orgImg = business card image 
cvDilate (orgImg, curImg, null, Some_Value) // find a value that erases all letters but leaves the logo 

imagemagick: convert monochrome.png -morphology dilate:3 diamond dilated.png 

output of connvert monochrome.png -morphology dilate:3 diamond dilated.png

2)有条件侵蚀扩张图像,使用原始图像作为掩模,直到标志是完整一次。

这意味着你会腐蚀膨胀的图像,但从来没有将像素值设置为低于原始源图像中的值。您可以使用原始图像作为蒙版来保护图像的某些部分免受更改。

这将恢复还是有一定的种子部分左侧所有的形状,所以才有了标志

// Not sure if opencv can use a mask in morphologial operations, 
// but you can just use erode + max in a loop to achive the same effect albeit slower 
repeat 
    lastImg = curImg 
    cvErode (lastImg, curImg, null ,1) 
    cvMax (curImg, orgImg, curImg) 
until lastImg == curImg 

imagemagick: convert dilated.png -morphology erode:20 diamond -clip-mask monochrome.png eroded.png 

output of convert dilated.png -morphology erode:20 diamond -clip-mask monochrome.png eroded.png

你现在有一个图像时,仅标志和没有文字,使用这张图片去除徽标

imagemagick: convert eroded.png -negate img0052ir.jpg -compose plus -composite test.png 

enter image description here

正如你所看到的,它远非完美。也许在opencv中玩弄thresholding,dilation kernel等,看看这是否可以改进。但我怀疑有一个通用的解决方案文本

编辑,去除所有的标志和无:一些照片添加

+0

在步骤1)您的意思是侵蚀而不是扩张,对? – chostDevil 2012-04-22 00:36:48

+0

我不明白第2步 – chostDevil 2012-04-22 01:00:17

+0

什么意思(用原始图像作为面具)? – chostDevil 2012-04-22 01:30:58