OPENCV实践项目-去除票据中的红色印章

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/

猜你喜欢

转载自blog.csdn.net/wyw0000/article/details/130999525