预备知识
结构元(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;}elsecout << "图像加载成功!" << 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小的部件。去除黏连像素以及噪声。
膨胀的作用
桥接裂缝,恢复连通性
作用:如图,由于无法实现理想的二值化,使得原本连通的像素集合被
分成不同的连通域,从而影响目标物的提取。可通过膨胀运算使其恢复
连通性。
这种方法比低通滤波有一个直接优点:形态学桥接可以直接得到一个二值化的图,
然而低通滤波则需要经过这样过程:二值图=>灰度图=>二值图。
另外需要了解的知识:
之后的击中击不中变换中将会用到这样的知识。
上面是以二值图为例的,下面我们以灰度图作为例子。
效果:使整个图像变暗且去除了局部较亮的像素
效果:使整个图像变亮且去除了局部较暗的像素