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

图像形态学

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

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

链接:图像形态学

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

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

using namespace std;
using namespace cv;

获取结构元素(getStructuringElement())

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

在这里插入图片描述

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

膨胀(dilate())

在这里插入图片描述

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);

运行结果:
在这里插入图片描述


腐蚀(erode())

在这里插入图片描述

参数与dilate一致

测试代码:

运行结果

在这里插入图片描述

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

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


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

在这里插入图片描述

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);

运行结果:
在这里插入图片描述

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

形态学操作
在这里插入图片描述
选择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);

在这里插入图片描述


顶帽

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

测试代码:

//顶帽
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);

运行结果:

在这里插入图片描述


黑帽

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

测试代码:

//黑帽
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);

运行结果:
在这里插入图片描述

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

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

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值