形态学操作——腐蚀与膨胀

预备知识

结构元(SE)

1、结构元的中心一般来说是放在其重心位置处,但原则上原点的选择是依赖于你要解决的问题的。
2、对图像操作时,我们要求结构元是矩形阵列。(在结构元的基础上添加较少的背景元素实现)
3、当结构元的中心位于原图像的边界时,要对原图像进行填充操作

2注意点中的填充阵列:
填充阵列
但是其实这样填充下来,只要给背景元素的权值赋0就和原来的一样了。
就像这样
这个阵列显然和下面的阵列不是一个类型
在这里插入图片描述
3注意点中的填充原图像
填充

原理

腐蚀

公式
该表达式表示:B对A的腐蚀使用一个z平移的B包含在A中的所有点z的集合。
效果:
效果
也就是B的中心在A中遍历之后,结构元素中没有背景元素(即全是前景元素)的B中心的点的集合。

膨胀

原理
效果
膨胀是腐蚀的对偶操作。相当于将B的中心沿着所有A的点遍历一遍,得到的B的所有元素的集合。

调用opencv库函数

#include <opencv2/opencv.hpp>
#include <iostream>
#include "windows.h"
#include <stdio.h>

using namespace cv;
using namespace std;
int main()
{
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);		//字体为绿色
	Mat srcImage = imread("D:\\opencv_picture_test\\形态学操作\\黑白.jpg");

	//判断图像是否加载成功
	if (srcImage.empty())
	{
		cout << "图像加载失败!" << endl;
		return -1;
	}
	else
		cout << "图像加载成功!" << endl << endl;

	namedWindow("原图像", WINDOW_NORMAL);     //定义窗口显示属性
	imshow("原图像", srcImage);
	
	//进行腐蚀操作
	Mat element_erode = getStructuringElement(MORPH_RECT,Size(15,15));	//返回的是内核矩阵
	Mat dstImage;
	erode(srcImage, dstImage, element_erode);					//腐蚀操作
	//显示效果图
	imshow("【腐蚀效果图】", dstImage);
	//进行膨胀操作
	//获取自定义核
	Mat element_dilate = getStructuringElement(MORPH_RECT, Size(15, 15));
	Mat out;
	//进行膨胀操作
	dilate(srcImage,out, element_dilate);
	imshow("【膨胀效果图】", out);
	waitKey(0);
	return 0;
}

效果

图片

作用

腐蚀的作用

消除A中比结构元B小的部件。去除黏连像素以及噪声。
look
去除黏连像素

膨胀的作用

桥接裂缝,恢复连通性
作用:如图,由于无法实现理想的二值化,使得原本连通的像素集合被
分成不同的连通域,从而影响目标物的提取。可通过膨胀运算使其恢复
连通性。
look
这种方法比低通滤波有一个直接优点:形态学桥接可以直接得到一个二值化的图,
然而低通滤波则需要经过这样过程:二值图=>灰度图=>二值图。

另外需要了解的知识:

性质
look

之后的击中击不中变换中将会用到这样的知识。

上面是以二值图为例的,下面我们以灰度图作为例子。1
效果:使整个图像变暗且去除了局部较亮的像素
效果
效果:使整个图像变亮且去除了局部较暗的像素

发布了29 篇原创文章 · 获赞 1 · 访问量 1019

猜你喜欢

转载自blog.csdn.net/qq_42604176/article/details/104815801