当前位置: 代码网 > 科技>操作系统>Windows > 08- OpenCV:形态学操作(膨胀与腐蚀 、提取水平与垂直线)

08- OpenCV:形态学操作(膨胀与腐蚀 、提取水平与垂直线)

2024年08月06日 Windows 我要评论
主要介绍 形态学操作(膨胀与腐蚀 、提取水平与垂直线),以及如何使用相应的api

目录

前言

一、膨胀(dilation)与 腐蚀(erosion)

二、形态学操作

1、开操作(opening)

2、闭操作(closing)

3、形态学梯度(morphological gradient)

4、顶帽 ( top hat)

5、黑帽 ( black hat)

6、相关的api

7、代码演示

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

1、原理方法

2、实现步骤


前言

1、了解图像形态学

2、图像形态学主要包括腐蚀(erosion)、膨胀(dilation)、开运算(opening)、闭运算(closing)等操作。

除了以上基本操作,还有其他形态学操作,如击中击不中变换(hit-or-miss transform)、顶帽运算(top hat transform)和黑帽运算(black hat transform)等。

这些图像形态学操作可以通过opencv库中的函数进行实现,例如cv::erodecv::dilatecv::morphologyex等函数。

3、膨胀与腐蚀是图像处理中最常用得形态学手段。

一、膨胀(dilation)与 腐蚀(erosion)

通俗来讲:膨胀是用来处理缺陷问题,腐蚀用来处理毛刺问题。

所以膨胀过后的图像边界看起来更加清晰;腐蚀后的图像去除噪点,边界模糊了。

1、膨胀含义:

跟卷积操作类似,假设有图像a和结构元素b,结构元素b在a上面移动,其中b定义其中心为锚点,计算b覆盖下a的最大像素值用来替换锚点的像素,其中b作为结构体可以是任意形状。

 2、腐蚀含义:

腐蚀跟膨胀操作的过程类似,唯一不同的是以最小值替换锚点重叠下图像的像素值。

3、相关的api:

(1)getstructuringelement(int shape, size ksize, point anchor)  

- 形状 (morph_rect \morph_cross \morph_ellipse)  

- 大小

 - 锚点 默认是point(-1, -1)意思就是中心像素

(2)dilate(src, dst, kernel)

(3)erode(src, dst, kernel)

4、相关代码演示

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

int main()
{
	cv::mat image = cv::imread("char.jpg", cv::imread_grayscale);
	if (image.empty())
	{
		std::cout << "failed to read image" << std::endl;
		return -1;
	}

	// 定义腐蚀和膨胀的核(结构元素)
	cv::mat kernel = cv::getstructuringelement(cv::morph_rect, cv::size(3, 3));

	// 腐蚀操作

	cv::mat eroded_image;
	cv::erode(image, eroded_image, kernel);

	// 膨胀操作

	cv::mat dilated_image;
	cv::dilate(image, dilated_image, kernel);

	cv::imshow("original image", image);
	cv::imshow("eroded image", eroded_image);
	cv::imshow("dilated image", dilated_image);
	cv::waitkey(0);
	cv::destroyallwindows();

	return 0;
}

效果展示:

二、形态学操作

1、开操作(opening)

(1)先腐蚀后膨胀

(2)可以去掉小的对象,假设对象是前景色,背景是黑色

2、闭操作(closing)

(1)先膨胀后腐蚀(bin2)

(2)可以填充小的洞(fill hole),假设对象是前景色,背景是黑色

3、形态学梯度(morphological gradient)

(1)膨胀减去腐蚀

(2)又称为基本梯度(其它还包括-内部梯度、方向梯度)

4、顶帽 ( top hat)

顶帽 是原图像与开操作之间的差值图像

5、黑帽 ( black hat)

黑帽是闭操作图像与源图像的差值图像

6、相关的api

morphologyex(src, dest, cv_mop_blackhat, kernel);

7、代码演示
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>

using namespace cv;
int main(int argc, char** argv) {
	mat src, dst;
	src = imread("d:/vcprojects/images/bin2.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_blackhat, kernel);
	imshow(output_title, dst);

	waitkey(0);
	return 0;
}

效果展示:(黑帽 cv_mop_blackhat)

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

1、原理方法

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

二值图像与灰度图像上的膨胀操作:

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

二值图像与灰度图像上的腐蚀操作

(3)结构元素

        1)上述膨胀与腐蚀过程可以使用任意的结构元素

        2)常见的形状:矩形、园、直线、磁盘形状、砖石形状等各种自定义形状。

2、实现步骤

(1)输入图像彩色图像 imread

(2)转换为灰度图像 – cvtcolor

(3)转换为二值图像 – adaptivethreshold

(4)定义结构元素

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

后处理

3、代码演示

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

using namespace cv;
int main(int argc, char** argv) {
	mat src, dst;
	src = imread("d:/vcprojects/images/chars.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, kernel);
	dilate(temp, dst, kernel);
	// 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)水平结构元素:

先腐蚀后膨胀,相当于一开始把垂直的元素擦掉,所以就保留了水平的线。

(2)垂直结构元素

先腐蚀后膨胀,相当于一开始把水平的元素擦掉,所以就保留了垂直的线。

(3)矩形结构

矩形大小的干扰项都去掉。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com