0

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

1)将图像转换为灰度

2)二进制图像

3) 反转颜色 (cv::bitwise_not) 以获得白色像素文本

4) 腐蚀图像(cv::erode)

5)使用canny检测边缘

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

代码:

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

1 回答 1

7

定义徽标的一种方法可能是徽标部分包含比文本部分更粗的线条和更大的斑点。

如果这是真的,您可以像这样删除徽标:

(我使用 imagemagick 生成以下示例,你应该可以与 opencv 相同)

0)阈值图像(可选)

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

输出:转换 img0052ir.jpg -threshold 60% 单色.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

connvert mono.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

convert dilated.png -morphology erode:20 diamond -clip-mask 单色.png eroded.png 的输出

您现在有一个只有徽标而没有文字的图像,使用此图像删除徽标

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

在此处输入图像描述

如您所见,它远非完美。也许在opencv中玩弄阈值,膨胀内核等,看看是否可以改进。但是我怀疑是否有一个通用的解决方案可以删除所有徽标并且不删除任何文字

编辑:添加了一些图片

于 2012-04-21T23:36:21.487 回答