C++ opencv 图像形态学、膨胀、腐蚀、闭、开、顶帽、黑帽

文章目录

  • 图像形态学
    • 获取结构元素(getStructuringElement())
    • 膨胀(dilate())
    • 腐蚀(erode())
    • 顶帽
    • 黑帽

图像形态学

形态学源于动物学与生物学。图像形态学主要研究图像的形态特征,实际表现为图像像素之间的关系。
图像像素与邻域像素进行特定的逻辑操作,操作的结果即为形态特征。

形态学图像处理的基本运算有4个:膨胀、腐蚀、开操作和闭操作
形态学的主要应用:边界提取、区域填充、连通分量的提取、凸壳、细化、粗化等

链接:图像形态学

本文头文件以及使用的命名空间

#pragma once
#include 
#include 

using namespace std;
using namespace cv;

获取结构元素(getStructuringElement())

在进行图像形态学操作前,需要获取图像结构元素。它类似于卷积与滤波中对图像操作的卷积核,opencv中使用getStructuringElement()获取特定形状与大小的结构元素,在被用于后续的形态学操作中。

C++ opencv 图像形态学、膨胀、腐蚀、闭、开、顶帽、黑帽_第1张图片

shape :结构元素的形状,MORPH_RECT矩形 MORPH_CROSS十字形 MORPH_ELLIPSE椭圆
ksize : 结构元素的大小
anchor :结构元素的锚点,默认为中心点

膨胀(dilate())

C++ opencv 图像形态学、膨胀、腐蚀、闭、开、顶帽、黑帽_第2张图片

src : 输入图像
dst : 输出图像
kernel : 结构元素,由getstructelement获得
anchor : 结构元素的锚点,默认中心
iteration : 膨胀的次数

测试代码:这里使用morphologyEx函数,内部也是调用dilate函数

//膨胀
	Mat m1 = imread(path8, 1);
	Mat m2;
	Mat kernel = getStructuringElement(MORPH_RECT, Size(7, 7), Point(-1, -1));
	morphologyEx(m1, m2, MORPH_DILATE, kernel);
	namedWindow("truth image", WINDOW_AUTOSIZE);
	namedWindow("dilate image", WINDOW_AUTOSIZE);
	imshow("truth image", m1);
	imshow("dilate image", m2);
	waitKey(0);

运行结果:
C++ opencv 图像形态学、膨胀、腐蚀、闭、开、顶帽、黑帽_第3张图片


腐蚀(erode())

C++ opencv 图像形态学、膨胀、腐蚀、闭、开、顶帽、黑帽_第4张图片

参数与dilate一致

测试代码:

运行结果

C++ opencv 图像形态学、膨胀、腐蚀、闭、开、顶帽、黑帽_第5张图片

膨胀与腐蚀也可以使用morphologyEx()函数中对应的操作,本质相同,morphologyEx()内部也是调用dilate和erode函数。

膨胀与腐蚀都相对于白色像素(255)而言,膨胀扩大白色区域,腐蚀缩小白色区域。两者不是互逆关系,由接下来的闭与开操作可知,膨胀与腐蚀的顺序会产生不同的结果。


闭操作,先膨胀在腐蚀,用于消除白色区域中的黑色的空洞。
图像形态学操作均可使用morphologyEx函数,选择不同的操作完成。

C++ opencv 图像形态学、膨胀、腐蚀、闭、开、顶帽、黑帽_第6张图片

src : 输入图像
dst : 输出图像
op : 选择的形态学操作
kernel : 结构元素
anchor : 结构元素的锚点
iterations : 执行形态学操作的次数

测试代码:

//闭操作
Mat m5 = imread(path6, 1);
Mat m6; 
//获取结构元素 矩形 尺寸为7 中心锚点
Mat kernel = getStructuringElement(MORPH_RECT, Size(7, 7),Point(-1, -1));
//形态学闭操作
morphologyEx(m5, m6, MORPH_CLOSE , kernel);
namedWindow("truth image", WINDOW_AUTOSIZE);
namedWindow("close image", WINDOW_AUTOSIZE);
imshow("truth image", m5);
imshow("close image", m6);
waitKey(0);

运行结果:
C++ opencv 图像形态学、膨胀、腐蚀、闭、开、顶帽、黑帽_第7张图片

结构元素的Size越大,就可以消去更大的黑洞。

形态学操作
C++ opencv 图像形态学、膨胀、腐蚀、闭、开、顶帽、黑帽_第8张图片
选择MORPH_CLOSE即为闭操作。


开操作,先腐蚀,在膨胀,用于消除黑色区域中的白点。选择MORPH_OPEN即为开操作。
测试代码:
运行结果:

//开操作
	Mat m7 = imread(path7, 1);
	Mat m8;
	Mat kernel = getStructuringElement(MORPH_RECT, Size(7, 7), Point(-1, -1));
	morphologyEx(m7, m8, MORPH_OPEN, kernel);
	namedWindow("truth image", WINDOW_AUTOSIZE);
	namedWindow("open image", WINDOW_AUTOSIZE);
	imshow("truth image", m7);
	imshow("open image", m8);
	waitKey(0);

C++ opencv 图像形态学、膨胀、腐蚀、闭、开、顶帽、黑帽_第9张图片


顶帽

原始图像减去开运算(先腐蚀在膨胀)。用于获取图像中的噪声

测试代码:

//顶帽
Mat m7 = imread(path7, 1);
Mat m8;
Mat kernel = getStructuringElement(MORPH_RECT, Size(7, 7), Point(-1, -1));
morphologyEx(m7, m8, MORPH_TOPHAT, kernel);
namedWindow("truth image", WINDOW_AUTOSIZE);
namedWindow("top hat image", WINDOW_AUTOSIZE);
imshow("truth image", m7);
imshow("top hat image", m8);
waitKey(0);

运行结果:

C++ opencv 图像形态学、膨胀、腐蚀、闭、开、顶帽、黑帽_第10张图片


黑帽

闭运算(先膨胀在腐蚀)减去原始图像。用于获取图像中的白色区域的黑点,并转为白色。

测试代码:

//黑帽
Mat m5 = imread(path6, 1);
Mat m6; 
Mat kernel = getStructuringElement(MORPH_RECT, Size(7, 7),Point(-1, -1));
morphologyEx(m5, m6, MORPH_BLACKHAT , kernel);
namedWindow("truth image", WINDOW_AUTOSIZE);
namedWindow("black hat image", WINDOW_AUTOSIZE);
imshow("truth image", m5);
imshow("black hat image", m6);
waitKey(0);

运行结果:
C++ opencv 图像形态学、膨胀、腐蚀、闭、开、顶帽、黑帽_第11张图片

参考链接: 图像顶帽与黑帽.

文章内容有误或可改正地方,可私信,会即使修改。

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