花老湿OpenCV学习:形态学操作应用-提取水平与垂直线

原理方法:

图像形态学操作时候,可以通过自定义的结构元素实现结构元素对输入图像一些对象敏感、另外一些对象不敏感,这样就会让敏

感的对象改变而不敏感的对象保留输出。通过使用两个最基本的形态学操作 – 膨胀腐蚀,使用不同的结构元素实现对输入图像

的操作、得到想要的结果。

- 膨胀,输出的像素值是结构元素覆盖下输入图像的最大像素值

- 腐蚀,输出的像素值是结构元素覆盖下输入图像的最小像素值

提取步骤:

1.输入图像彩色图像 imread

2.转换为灰度图像 cvtColor

3.转换为二值图像 adaptiveThreshold

4.定义结构元素

5.开操作 (腐蚀+膨胀)提取 水平与垂直线

代码如下:

#include "pch.h"
#include 
#include "opencv2/opencv.hpp"

using namespace std;
using namespace cv;


int main()
{
	Mat src = imread("F:\\visual studio\\Image\\line.png");
	if (src.empty())
	{
		cout << "Can't load the image" << endl;
		return -1;
	}
	imshow("src", src);
	Mat gray;
	cvtColor(src, gray, CV_BGR2GRAY);
	Mat bin;
        //二值化操作,adaptiveThreshold见书p233
	//为了接下来的腐蚀-膨胀操作,让线条为白色比较适合,因此添加一个取反操作。
	adaptiveThreshold(~gray, bin, 255, cv::ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, 0);
	imshow("bin", bin);

	Mat hdst;
	Mat vdst;
	//结构元素分别为一条水平线 和 一条竖直线
	Mat hline = getStructuringElement(MORPH_RECT, Size(bin.cols / 16, 1), Point(-1, -1));
	Mat vline = getStructuringElement(MORPH_RECT, Size(1, bin.rows/16), Point(-1, -1));
	//erode(bin, hdst, hline, Point(-1, -1));
	//dilate(dst, hdst, hline, Point(-1, -1));
	//与上述腐蚀、膨胀等价
	morphologyEx(bin, hdst, MORPH_OPEN, hline, Point(-1, -1));
	//让背景与原图像一样为白色
	bitwise_not(hdst, hdst);
	imshow("hresult", hdst);
	
	morphologyEx(bin, vdst, MORPH_OPEN,vline, Point(-1, -1));
	//让背景与原图像一样为白色
	bitwise_not(vdst, vdst);
	imshow("vresult", vdst);
	waitKey(0);
}

效果如下:能够提取出水平与垂直线。

花老湿OpenCV学习:形态学操作应用-提取水平与垂直线_第1张图片

 

利用形态学开操作也能够提取图片中的文字:

#include "pch.h"
#include 
#include "opencv2/opencv.hpp"

using namespace std;
using namespace cv;


int main()
{
	Mat src = imread("F:\\visual studio\\Image\\abcd.png");
	if (src.empty())
	{
		cout << "Can't load the image" << endl;
		return -1;
	}
	imshow("src", src);
	Mat gray;
	cvtColor(src, gray, CV_BGR2GRAY);
	Mat bin;
	//为了接下来的腐蚀-膨胀操作,让线条为白色比较适合,因此添加一个取反操作。
	adaptiveThreshold(~gray, bin, 255, cv::ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, 0);
	imshow("bin", bin);

	Mat dst;
	Mat structureElement = getStructuringElement(MORPH_RECT, Size(5,5), Point(-1, -1));
	//erode(bin, hdst, hline, Point(-1, -1));
	//dilate(dst, hdst, hline, Point(-1, -1));
	//与上述腐蚀、膨胀等价
	morphologyEx(bin, dst, MORPH_OPEN, structureElement, Point(-1, -1));
	//让背景与原图像一样为白色
	bitwise_not(dst, dst);
	imshow("result", dst);
	waitKey(0);
}

花老湿OpenCV学习:形态学操作应用-提取水平与垂直线_第2张图片

 

 

 

你可能感兴趣的:(OpenCV学习,OPenCV,提取水平与垂直线,形态学操作)