OpenCV C++开发 第二节:图像处理(六、形态学操作、形态学应用之提取水平垂直线)

13 篇文章 1 订阅

一、形态学操作

代码:

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
int main(int argc, char** argv) {
	Mat src, dst;
	src = imread("C:\\Users\\Administrator\\Desktop\\test.png");
	if (!src.data) {
		printf("could not load image...\n");
	}
	namedWindow("input image", CV_WINDOW_AUTOSIZE);
	imshow("input image", src);
	char output_title[] = "morphology demo";
	namedWindow(output_title, CV_WINDOW_AUTOSIZE);

	Mat kernel = getStructuringElement(MORPH_RECT, Size(11, 11), Point(-1, -1));
	morphologyEx(src, dst, CV_MOP_OPEN, kernel);//形态学操作
	imshow(output_title, dst);

	waitKey(0);
	return 0;
}

以上代码中主要的几个知识点解释下:

1.Mat kernel = getStructuringElement(MORPH_RECT, Size(11, 11), Point(-1, -1));

这里还是之前讲到的掩膜的设置。

MORPH_RECT是方形,MORPH_CROSS是十字形结构,MORPH_ELLIPSE是椭圆形。
第二个Size参数是掩膜的大小。

2.morphologyEx(src, dst, CV_MOP_OPEN, kernel);

这里是形态学操作的方法,常用的五种类型:

(1)CV_MOP_OPEN

开操作。相当于先腐蚀后膨胀,可以去掉小的白色对象。如下图。

(2)CV_MOP_CLOSE

闭操作。相当于先膨胀后腐蚀,可以填充小的黑色洞。如下图。

(3)CV_MOP_GRADIENT

形态学梯度。相当于膨胀减去腐蚀。如下图

(4)CV_MOP_TOPHAT

顶帽。相当于原图像与开操作的差值图像。如下图。

(5)CV_MOP_BLACKHAT

黑帽。相当于闭操作与源图像的差值图像。如下图。

二、形态学应用之提取水平垂直线

代码:

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
int main(int argc, char** argv) {
	Mat src, dst;
	src = imread("C:\\Users\\Administrator\\Desktop\\line.png");
	if (!src.data) {
		printf("could not load image...\n");
		return -1;
	}

	char INPUT_WIN[] = "input image";
	char OUTPUT_WIN[] = "result image";
	namedWindow(INPUT_WIN, CV_WINDOW_AUTOSIZE);
	imshow(INPUT_WIN, src);

	Mat gray_src;
	cvtColor(src, gray_src, CV_BGR2GRAY);
	imshow("gray image", gray_src);

	Mat binImg;
	adaptiveThreshold(~gray_src, binImg, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
	imshow("binary image", binImg);

	// 水平结构元素
	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));
	// 矩形结构
	Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));

	Mat temp;
	erode(binImg, temp, hline);//hline是获取横线,vline是竖线
	dilate(temp, dst, hline);//hline是获取横线,vline是竖线
	// morphologyEx(binImg, dst, CV_MOP_OPEN, vline);//上面两行可以用这个替代,开操作。
	bitwise_not(dst, dst);
	//blur(dst, dst, Size(3, 3), Point(-1, -1));
	imshow("Final Result", dst);

	waitKey(0);
	return 0;
}

这张是原图,可右键另存做测试,也可以自己画一张。

以上代码中主要的几个知识点解释下:

1.cvtColor(src, gray_src, CV_BGR2GRAY);

变灰度图。

2.adaptiveThreshold(~gray_src, binImg, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);

变成二值图像。就是只有黑色和白色两种的图。

3.erode(binImg, temp, hline);
    dilate(temp, dst, hline);

这里相是先腐蚀后膨胀,就是形态学开操作。

横线获取:用一像素高的水平掩膜去计算。

竖线获取:用一像素宽的竖直掩膜去计算。

4.bitwise_not(dst, dst);

全部取反操作。白色变黑色,黑色变白色。

最后的效果如图:

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在C++中使用OpenCV去除竖亮条纹,可以使用傅里叶变换来实现。具体步骤如下: 1.读取图像并转换为灰度图像。 2.进行傅里叶变换,并将变换结果进行中心化。 3.生成一个掩模,将竖亮条纹所在的频率区域设置为0。 4.将掩模应用于傅里叶变换后的图像。 5.进行傅里叶逆变换,得到去除竖亮条纹后的图像。 下面是一个示例代码: ```c++ #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { // 读取图像并转换为灰度图像 Mat img = imread("input.jpg"); Mat gray; cvtColor(img, gray, CV_BGR2GRAY); // 进行傅里叶变换,并将变换结果进行中心化 Mat f; dft(Mat_<float>(gray), f); shift(f, f, cv::Point(-f.cols/2, -f.rows/2)); // 生成一个掩模,将竖亮条纹所在的频率区域设置为0 Mat mask = Mat::ones(gray.size(), CV_32F); int rows = gray.rows, cols = gray.cols; int crow = rows / 2, ccol = cols / 2; mask.rowRange(crow-30, crow+30).colRange(ccol-2, ccol+2) = 0; mask.rowRange(crow-30, crow+30).colRange(ccol-4, ccol) = 0; mask.rowRange(crow-30, crow+30).colRange(ccol, ccol+4) = 0; // 将掩模应用于傅里叶变换后的图像 Mat result; mulSpectrums(f, mask, result, 0); // 进行傅里叶逆变换,得到去除竖亮条纹后的图像 Mat ift; shift(result, result, cv::Point(result.cols/2, result.rows/2)); idft(result, ift); // 显示结果 Mat output; normalize(ift, output, 0, 255, NORM_MINMAX, CV_8U); imshow("input", img); imshow("output", output); waitKey(0); return 0; } ``` 在这个示例代码中,我们首先读取了一张名为"input.jpg"的图像,并将其转换为灰度图像。然后,使用`dft`函数进行傅里叶变换,并使用`shift`函数将变换结果进行中心化。接着,生成一个掩模,将竖亮条纹所在的频率区域设置为0。然后,使用`mulSpectrums`函数将掩模应用于傅里叶变换后的图像。最后,使用`idft`函数进行傅里叶逆变换,得到去除竖亮条纹后的图像,并使用`normalize`函数将图像像素值归一化到0~255之间。最后使用`imshow`函数将原始图像和去除竖亮条纹后的图像显示出来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值