OpenCV-学习历程12- 形态学操作应用(提取水平与垂直线)

OPENCV系列博客主要记录自己学习OPENCV的历程,以及存储已经实现的代码,以备后续回顾使用,代码中包含了主要的备注。

 一. 原理方法

 二. 代码实现

#include <opencv2/opencv.hpp>
#include <iostream>


using namespace std;
using namespace cv;



/***********************************
* 形态学操作例子:使用形态学操作,消除图片内部的横线和竖线
* 方法为: 使用膨胀+腐蚀处理二值化之后的图片;
* 步骤为:
* 1. 读取图片,依次将图片修改为灰度图,并将灰度图转化为二值图
* 2. 创建形态学操作子
* 3. 依次使用腐蚀 和膨胀操作,消除图片中的横线与竖线

***********************************/
int main(int argc, char** argv) {

	//Step1 读取图片,并显示出来
	Mat src = imread("E:/OpenCVLearning/Project/source_image/LineRemoval.jpg"); //注意斜线方向
	if (!src.data) {
		cout << "Could not load the image ...." << endl;
		return -1;
	}

	char input_image[] = "Original Image";										//窗口名
	namedWindow(input_image,CV_WINDOW_AUTOSIZE);								//创建窗口
	imshow(input_image,src);													//显示


	//Step2 将图片转化为灰度图,并显示
	Mat gray_src;
	cvtColor(src,gray_src,COLOR_BGR2GRAY);

	char gray_image[] = "GrayScale Image";										//窗口名
	namedWindow(gray_image, CV_WINDOW_AUTOSIZE);								//创建窗口
	imshow(gray_image, gray_src);												//显示


	//Step3 !将图片转化为二值图
	Mat bin_src;
	//!!重要:转化为二值图的方式
	//       (输入灰度图,输出二值图,!二值图最大值,!自适应方法,!阈值类型,块大小,!常量)
	adaptiveThreshold(~gray_src,bin_src,255, ADAPTIVE_THRESH_MEAN_C,THRESH_BINARY, 15, -2);

	char bin_image[] = "Bin Image";										//窗口名
	namedWindow(bin_image, CV_WINDOW_AUTOSIZE);								//创建窗口
	imshow(bin_image, bin_src);												//显示

	//Step4 !创建形态学元素
	Mat hline = getStructuringElement(MORPH_RECT,  Size(src.cols/16,1),Point(-1,-1));
	Mat vline = getStructuringElement(MORPH_RECT,  Size(1,src.rows/16), Point(-1, -1));
	
	
	//Step4 先腐蚀再膨胀
	//      注意!腐蚀是:用形态学元素,覆盖图片上,仅在中心保留最小的值。 (由于二值图中,0是黑,1是白; 所以黑色被保留)
	Mat temp_image;
	erode(bin_src, temp_image, hline);
	erode(temp_image, temp_image, hline);
	imshow("Final_image", temp_image);


	waitKey(0);
	return 0;
}

. 实现效果

猜你喜欢

转载自blog.csdn.net/weixin_42503785/article/details/113927364