opencvC++学习12形态学操作应用-提取水平与垂直线

形态学操作应用-提取水平与垂直线

原理方法

图像形态学操作时候,可以通过自定义的结构元素实现结构元素
对输入图像一些对象敏感、另外一些对象不敏感,这样就会让敏
感的对象改变而不敏感的对象保留输出。通过使用两个最基本的
形态学操作 – 膨胀与腐蚀,使用不同的结构元素实现对输入图像
的操作、得到想要的结果。

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

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

提取步骤

输入图像彩色图像 imread
转换为灰度图像 – cvtColor
转换为二值图像 – adaptiveThreshold
定义结构元素

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

代码:

#include <opencv2\opencv.hpp>

using namespace cv;
using namespace std;


Mat src;
Mat dst;


int main()
{
	src = imread("D:/opencvSRC/font.jpg");
	if (!src.data) {

		printf("load image error!\n");
	}
	namedWindow("src", CV_WINDOW_AUTOSIZE);
	imshow("src", src);
	//灰度
	Mat gray;
	if (src.channels() == 3) {

		cvtColor(src, gray, CV_BGR2GRAY);
	}
	else {

		gray = src;
	}

	imshow("gray", gray);

	//转换为二值图像
	Mat dest;
	adaptiveThreshold(~gray, dest, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
	imshow("dest", dest);

	Mat lineHKernel = getStructuringElement(MORPH_RECT, Size(src.cols / 30, 1), Point(-1, -1));
	Mat lineVKernel = getStructuringElement(MORPH_RECT, Size(1, src.cols / 30), Point(-1, -1));
	Mat fontKernel = getStructuringElement(MORPH_RECT, Size(5, 5), Point(-1, -1));

	//开操作
	Mat lineH;
	Mat lineV;
	Mat font;

	morphologyEx(dest, lineH, CV_MOP_OPEN, lineHKernel, Point(-1, -1));
	morphologyEx(dest, lineV, CV_MOP_OPEN, lineVKernel, Point(-1, -1));

	morphologyEx(dest, font, CV_MOP_OPEN, fontKernel, Point(-1, -1));

	//erode(dest, lineH, lineHKernel);
	//imshow("lineH", lineH);
	//dilate(lineH, lineH, lineHKernel);


	blur(font, font, Size(3, 3));

	bitwise_not(lineH, lineH);
	bitwise_not(lineV, lineV);
	bitwise_not(font, font);
	imshow("lineH", lineH);
	imshow("lineV", lineV);
		imshow("font", font);








	waitKey(0);
	return 0;
}



效果:


猜你喜欢

转载自blog.csdn.net/xiansong1005/article/details/80707836