一. 我们经常要在图像上处理字符背景,将字符分割出来。如下图:
将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;
}
运行结果:
灰度图:
二值图:
形态学后结果图: