opencv提取图片水平线,垂直线和文字

原理方法

先说原理:通过膨胀和腐蚀操作,通过改变输入的结构元素实现提取水平线和垂直线文字opencv提取图片水平线,垂直线和文字_第1张图片

提取步骤

  1. 输入彩色图像(imread)
  2. 转换为灰度图像(cvtColor)
  3. 灰度图像装换为二值图像(adaptiveThreshold)
  4. 定义结构元素
  5. 开操作(腐蚀膨胀)提取目标对象
    注意:
    提取水平线或者垂直线或者文字取决于你定义的结构元素不同而不同,下面会详细说明不同的结构元素。

演示

提取水平线

结构元素的定义:

Mat hline = getStructuringElement(MORPH_RECT, Size(src.cols / 16, 1), Point(-1, -1));
//求水平线需要的结构元素

先来看看原图:
opencv提取图片水平线,垂直线和文字_第2张图片
提取代码:

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);

提取后的结果:
opencv提取图片水平线,垂直线和文字_第3张图片

提取垂直线

结构元素的定义:

	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));//这个函数可以让输出更平滑

来看看提取后的图像:
opencv提取图片水平线,垂直线和文字_第4张图片
补充一点:
结构元素中Size的大小设置Size(src.cols / 16, 1)和Size(1,src.rows/16)中的/16是可以更改的,要提取的线越细小,下面除数也应该也大。

提取文字

定义结构元素:

Mat char1 = getStructuringElement(MORPH_RECT, Size(5, 5), Point(-1, -1));
//提取文字,根据文字大小调整Size即可

先看一手原图:
opencv提取图片水平线,垂直线和文字_第5张图片
一张的悲伤照片
代码:

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);

最终效果:
opencv提取图片水平线,垂直线和文字_第6张图片
这里的一些噪点和文字大小接近提取的就比较不理想

你可能感兴趣的:(opencv自学,opencv,计算机视觉,c++)