我的目标是从扫描的名片图像中删除任何非文本区域,但我不知道使用 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);