前导知识
图像形态学操作:基于形状的一系列图像处理操作的合集,主要是基于集合论基础上的形态学数学
形态学有四个基本操作:腐蚀、膨胀、开、闭
膨胀与腐蚀是图像处理中最常用的形态学操作手段
定义
膨胀
跟卷积操作类似,假设有图像A和结构元素B,结构元素B在A上面移动,其中B定义其中心为锚点,计算B覆盖下A的最大像素值用来替换锚点的像素,其中B作为结构体可以是任意形状。
这种操作会造成图像中像素值高的区域变大,而像素值小的区域变小。(亮区变粗,暗区变细)
腐蚀
腐蚀跟膨胀操作的过程类似,唯一不同的是以最小值替换锚点重叠下图像的像素值
这种操作会造成图像中像素值高的区域变小,而像素值小的区域变大。(亮区变细,暗区变粗)
API
结构元形状构造函数
函数原型:
getStructuringElement( int shape, Size ksize, Point anchor )
参数:
- shape:结构元类型:
1)MORPH_RECT 表示产生矩形的结构元
2)MORPH_ELLIPSEM 表示产生椭圆形的结构元
3)MORPH_CROSS 表示产生十字交叉形的结构元
- ksize:表示结构元的尺寸,即(宽,高),必须是奇数
- anchor:表示结构元的锚点,即参考点。默认值Point(-1, -1)代表中心像素为锚点
膨胀
函数原型:
void dilate( InputArray src, OutputArray dst, InputArray kernel, Point anchor = Point(-1,-1), int iterations = 1, int borderType = BORDER_CONSTANT, const Scalar& borderValue = morphologyDefaultBorderValue() );
参数:
- src:表示输入矩阵
- element:表示结构元,即 函数getStructuringElement( )的返回值
- anchor:结构元的锚点,即参考点
- iterations:膨胀操作的次数,默认为一次
- borderType:边界扩充类型
- borderValue:边界扩充值
腐蚀
函数原型:
void erode( InputArray src, OutputArray dst, InputArray kernel, Point anchor = Point(-1,-1), int iterations = 1, int borderType = BORDER_CONSTANT, const Scalar& borderValue = morphologyDefaultBorderValue() );
参数:
- src:表示输入矩阵
- dst:表示输出矩阵
- element:表示结构元,即 函数getStructuringElement( )的返回值
- anchor:结构元的锚点,即参考点
- iterations:腐蚀操作的次数,默认为一次
- borderType:边界扩充类型
- borderValue:边界扩充值
案例
案例中用到了 Trackbar 函数,可以参考我的另一篇博文学习 Trackbar:
https://blog.csdn.net/weixin_45525272/article/details/121265662
膨胀
效果展示:
代码如下:
#include <iostream> #include <math.h> #include <opencv2/opencv.hpp> #include<opencv2/highgui.hpp> #include <opencv2/highgui/highgui_c.h> using namespace cv; using namespace std; Mat src, dst; // 全局变量 int element_size = 3; // 全局变量 int max_size = 21; // 全局变量 void CallBack_func(int, void*); int main() { src = imread("test2.jpg"); if (src.empty()) { printf("could not load the image...\n"); return -1; } namedWindow("原图:", CV_WINDOW_AUTOSIZE); imshow("原图:", src); namedWindow("膨胀操作后:", CV_WINDOW_AUTOSIZE); createTrackbar("结构元尺寸 :", "膨胀操作后:", &element_size, max_size, CallBack_func); CallBack_func(element_size, 0); waitKey(0); return 0; } // 膨胀操作 Trackbar 回调函数 void CallBack_func(int, void*) { int s = element_size * 2 + 1; Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1)); // 创建结构元 dilate(src, dst, structureElement, Point(-1, -1), 1); // 调用膨胀API imshow("膨胀操作后:", dst); }