膨胀,直观上就是把白色区域扩大
腐蚀,与膨胀相反,缩小白色区域
膨胀
void dilate(InputArray src, OutputArray dst, InputArray kernel,
Point anchor = Point(-1,-1), int iterations = 1, int borderType = BORDER_CONTANT, const Scalar & borderValue=morphologyDefaultBorderValue());
看前三个参数就行了,后面的用默认参数
第一个参数 输入
第二个参数 输出
第三个参数 内核类型
第三个参数为NULL时,默认用一个3*3的方形内核
一般配合getStructuringElement函数来获得内核类型
这个函数有两个参数
第一个参数三选一
MORPH_RECT 内核为方形
MORPH_CROSS 内核为十字形
MORPH_ELLIPSE 内核为椭圆形
第二个参数为一个Size对象
代表内核大小
腐蚀
void erode(InputArray src, OutputArray dst, InputArray kernel,
Point anchor = Point(-1,-1), int iterations = 1, int borderType = BORDER_CONTANT, const Scalar & borderValue=morphologyDefaultBorderValue());
和dilate函数用法基本一致,只是效果相反
例子
#include <core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
Mat ma1;
Mat ma2;
Mat ma3;
int g_dilateCoreValue=0;
int g_erodeCoreValue=0;
void on_dilate(int, void*)
{
dilate(ma1, ma2, getStructuringElement(MORPH_RECT, Size(g_dilateCoreValue + 1, g_dilateCoreValue + 1)));
imshow("im2", ma2);
}
void on_erode(int, void*)
{
erode(ma1, ma3, getStructuringElement(MORPH_RECT, Size(g_erodeCoreValue + 1, g_erodeCoreValue + 1)));
imshow("im3", ma3);
}
int main()
{
ma1 = imread("1.png"); //读入要操作的图像
imshow("im1", ma1);
dilate(ma1, ma2, getStructuringElement(MORPH_RECT, Size(15,15))); //膨胀,方形
imshow("im2", ma2);
dilate(ma1, ma2, getStructuringElement(MORPH_CROSS, Size(15, 15))); //膨胀,十字
imshow("im2_1", ma2);
dilate(ma1, ma2, getStructuringElement(MORPH_ELLIPSE, Size(15, 15))); //膨胀,椭圆
imshow("im2_2", ma2);
erode(ma1, ma3, getStructuringElement(MORPH_RECT, Size(15, 15))); //腐蚀,方形
imshow("im3", ma3);
erode(ma1, ma3, getStructuringElement(MORPH_CROSS, Size(15, 15))); //腐蚀,十字
imshow("im3_1", ma3);
erode(ma1, ma3, getStructuringElement(MORPH_ELLIPSE, Size(15, 15))); //腐蚀,椭圆
imshow("im2_3", ma3);
createTrackbar("内核大小", "im2", &g_dilateCoreValue, 100, on_dilate); //建立滑动条,动态观察核的大小变化时,图像的变化
createTrackbar("内核大小", "im3", &g_erodeCoreValue, 100, on_erode);
while (waitKey(10) != 27);
return 0;
}