先说原理:通过膨胀和腐蚀操作,通过改变输入的结构元素实现提取水平线和垂直线文字
结构元素的定义:
Mat hline = getStructuringElement(MORPH_RECT, Size(src.cols / 16, 1), Point(-1, -1));
//求水平线需要的结构元素
cvtColor(img, dst, COLOR_BGR2GRAY);//转化为灰度图
adaptiveThreshold(~dst, src, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
//转换为二值图
//~dst表示对dst图像取反,既相当于白色背景变成黑色,黑色背景变成白色
//注意通过该方法转化输入要为灰度图
Mat hline = getStructuringElement(MORPH_RECT, Size(src.cols / 16, 1), Point(-1, -1));
//求水平线需要的结构元素
morphologyEx(src, src, MORPH_OPEN, hline);//提取水平线
bitwise_not(src, src);//把背景变为白色,内容变为黑色,反差
blur(src, src, Size(3, 3), Point(-1, -1));//这个函数可以让输出更平滑
imshow("水平", src);
结构元素的定义:
Mat vline = getStructuringElement(MORPH_RECT, Size(1,src.rows/16), Point(-1, -1));
//求垂直线需要的结构元素
任然使用刚刚那个图片吧
提取代码与提取水平线大同小异
cvtColor(img, dst, COLOR_BGR2GRAY);//转化为灰度图
adaptiveThreshold(~dst, src, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
//转换为二值图
//~dst表示对dst图像取反,既相当于白色背景变成黑色,黑色背景变成白色
//注意通过该方法转化输入要为灰度图
Mat vline = getStructuringElement(MORPH_RECT, Size(1,src.rows/16), Point(-1, -1));
//求垂直线需要的结构元素
morphologyEx(src, src, MORPH_OPEN, vline);//提取竖直线
bitwise_not(src, src);//把背景变为白色,内容变为黑色,反差
blur(src, src, Size(3, 3), Point(-1, -1));//这个函数可以让输出更平滑
来看看提取后的图像:
补充一点:
结构元素中Size的大小设置Size(src.cols / 16, 1)和Size(1,src.rows/16)中的/16是可以更改的,要提取的线越细小,下面除数也应该也大。
定义结构元素:
Mat char1 = getStructuringElement(MORPH_RECT, Size(5, 5), Point(-1, -1));
//提取文字,根据文字大小调整Size即可
cvtColor(img, dst, COLOR_BGR2GRAY);//转化为灰度图
adaptiveThreshold(~dst, src, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
//转换为二值图
//~dst表示对dst图像取反,既相当于白色背景变成黑色,黑色背景变成白色
//注意通过该方法转化输入要为灰度图
Mat char1 = getStructuringElement(MORPH_RECT, Size(5, 5), Point(-1, -1));
//提取文字,根据文字大小调整Size即可
morphologyEx(src, src, MORPH_OPEN, char1);//开操作提取文字
bitwise_not(src, src);//把背景变为白色,内容变为黑色,反差
blur(src, src, Size(3, 3), Point(-1, -1));//这个函数可以让输出更平滑
imshow("文字", src);