目录
- 1. 实现方法
- 2. 代码实现
- 3. 结果展示
1. 实现方法
现实生活中,一些票据(比如发票、车票)等都会有一个红色印章,有时会盖在某个关键区域,影响了其他的字符识别。因此,为了提高准确率,我们尽量会移除红色印章,具体实现方法如下:
- 对彩色图分离通道,拿到红色通道图
- 进行阈值分割
2. 代码实现
int main()
{char* path = "C:\\Users\\Administrator\\Desktop\\piaoju.png";Mat src = imread(path);if (src.empty()) {return -1;}imshow("original", src);Mat gray;cvtColor(src, gray, CV_BGR2GRAY);//全局二值化int thresh_value = 100;Mat binary;threshold(gray, binary, thresh_value, 255, CV_THRESH_BINARY);imshow("binary", binary);vector<Mat> channes;split(src, channes);Mat red = channes[2];imshow("red", red);Mat red_binary;threshold(red, red_binary, thresh_value, 255, CV_THRESH_BINARY);imshow("red+binary", red_binary);Mat red_dilate;Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));dilate(red_binary, red_dilate, kernel);Mat kernel_ellipse = getStructuringElement(MORPH_ELLIPSE, Size(2, 2), Point(-1, -1));morphologyEx(red_binary, red_dilate, MORPH_OPEN, kernel_ellipse, Point(-1, -1));imshow("red+binary+dilate", red_dilate);waitKey();return 0;
}
3. 结果展示
注意
作者注释掉了最后的腐蚀和开运算,估计是因为效果不明显,我也对核的大小进行了调整测试,相对red_binary只是稍微清晰了一些。
原文地址:https://www.freesion.com/article/6510242781/