opencv字符预处理去掉背景

一. 我们经常要在图像上处理字符背景,将字符分割出来。如下图:

opencv字符预处理去掉背景_第1张图片

将hello 分离出来。

具体步骤:

1. 灰度转换,将原图转换成单通道的灰度图。

   API:cvtColor(src, gray_src, CV_BGR2GRAY);

2. 二值化处理, 这一步使用阈值分割

adaptiveThreshold(~gray_src, binary, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);

采用自适应阈值API。ADAPTIVE_THRESH_MEAN_C 均值方式,另外有高斯方式,感兴趣的可用试试。

3. 形态学操作,去除字符上的杂点和线条

采用开操作。开操作的实质就是先腐蚀再膨胀。

Mat kernel = getStructuringElement(MORPH_RECT, Size(3,3), Point(-1,-1));

morphologyEx(binary,dst, MORPH_OPEN, kernel, Point(-1,-1),1,0);

 

二. 源代码如下:

#include "stdafx.h"
#include 
#include 

using namespace cv;

int _tmain(int argc, _TCHAR* argv[])
{
	Mat gray_src, binary, dst;
	Mat src = imread("C:/Users/kenny/Pictures/Saved Pictures/hello.jpg");
	if(src.empty())
	{
		return -1;
	}
	namedWindow("display", CV_WINDOW_AUTOSIZE);
	imshow("src image", src);

	// 转为灰度图
	cvtColor(src, gray_src, CV_BGR2GRAY);
	imshow("gray image",gray_src);

	//blur(gray_src, gray_src, Size(3,3), Point(-1,-1));
	
	// 二值化处理
	adaptiveThreshold(~gray_src, binary, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
    imshow("binary image", binary);

	// 形态学操作 开操作,先腐蚀再膨胀, 提取字母
	Mat temp;
	Mat kernel = getStructuringElement(MORPH_RECT, Size(3,3), Point(-1,-1));
// 	erode(binary, temp, kernel, Point(-1,-1), 1);
// 	dilate(temp, dst, kernel, Point(-1,-1), 1);

	morphologyEx(binary,dst, MORPH_OPEN, kernel, Point(-1,-1),1,0); // 如去掉字母的话,使用顶帽操作,顶帽是原图减去开操作图的差值
	imshow("dst image", dst);


	waitKey(0);

	return 0;
}

 

运行结果:

灰度图:

opencv字符预处理去掉背景_第2张图片

二值图:

opencv字符预处理去掉背景_第3张图片

形态学后结果图:

opencv字符预处理去掉背景_第4张图片

 

 

你可能感兴趣的:(opencv)