【问题标题】:How to use OpenCV to remove non text areas from a business card? [closed]如何使用 OpenCV 从名片中删除非文本区域? [关闭]
【发布时间】:2012-04-21 00:07:54
【问题描述】:

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

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);

【问题讨论】:

  • 你试过什么?您能否尝试将您的问题缩小到具体的问题,否则我想这将因“非建设性”而关闭
  • 请同时提供示例图片,@PatrickJones

标签: c++ image-processing opencv ocr image-segmentation


【解决方案1】:

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

如果这成立,您可以像这样删除徽标:

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

0) 阈值图像(可选)

   imagemagick: 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

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

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

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

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

编辑:添加了一些图片

【讨论】:

  • 在第 1 步)你的意思是腐蚀而不是膨胀,对吧?
  • 什么意思(以原图为掩码)?
  • @Patrick Jones:添加了一些图片和说明。
  • 我在这里解释了一个 Opencv 答案:stackoverflow.com/questions/10262600/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-12
  • 1970-01-01
  • 2018-05-31
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
相关资源
最近更新 更多