Opencv图像处理——水平线和垂直线的提取

Opencv图像处理——水平线和垂直线的提取

检测原理

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

操作过程

  • 输入彩色图像-imread
  • 转换为灰度图像-cvtColor
  • 转换为二值图像-adaptiveThreshold
  • 定义结构元素
  • 开操作(腐蚀+膨胀)提取水平与垂直直线

代码:

#include
#include
cv::Mat gray_src;
cv::Mat dst;
int main()
{
     
	cv::Mat image = cv::imread("2.jpg");
	cv::namedWindow("input image");
	cv::imshow("input image",image);
	//转换为灰度图像
	cv::cvtColor(image, gray_src, cv::ColorConversionCodes::COLOR_BGR2GRAY);
	cv::namedWindow("gray_src");
	cv::imshow("gray_src", gray_src);
	//转换为二值图像
	cv::Mat binimg;
	//"~"去二值图像去反操作
	cv::adaptiveThreshold(~gray_src, binimg, 255, cv::AdaptiveThresholdTypes::ADAPTIVE_THRESH_MEAN_C, cv::ThresholdTypes::THRESH_BINARY, 15, -2);
	cv::imshow("binimg0", ~gray_src);
    //定义结构元素
	//cv::Mat kernel = cv::getStructuringElement(cv::MorphShapes::MORPH_RECT, cv::Size(image.rows /8, 1), cv::Point(-1, -1));
	//cv::Mat kernel = cv::getStructuringElement(cv::MorphShapes::MORPH_RECT, cv::Size(1,image.cols / 6), cv::Point(-1, -1));
	cv::Mat kernel = cv::getStructuringElement(cv::MorphShapes::MORPH_RECT, cv::Size(5 , 5), cv::Point(-1, -1));
	
	/*cv::Mat temp;
	cv::erode(binimg, temp, kernel);
	cv::dilate(temp, dst, kernel);*/
	//开操作
	cv::morphologyEx(binimg, dst, cv::MorphTypes::MORPH_OPEN, kernel);
	cv::imshow("output", dst);
	cv::waitKey(0);
	return 0;
}

结果:

Opencv图像处理——水平线和垂直线的提取_第1张图片
Opencv图像处理——水平线和垂直线的提取_第2张图片
Opencv图像处理——水平线和垂直线的提取_第3张图片

你可能感兴趣的:(Opencv,C++,opencv,计算机视觉)