【发布时间】: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