图像形态学的基本操作:腐蚀、膨胀。
图像的膨胀和腐蚀使用的函数为dilate和erode,以下是函数的原型:
void dilate //erode
(
InputArray src, //输入源图像,填Mat类的图像即可,图像的通道数量是任意的
OutputArray dst, //目标图像,需要和源图像有一样的尺寸和类型
InputArray kernel, //膨胀操作的核。当此值为NULL时,表示的是使用参考点位于中心3*3的核
Point anchor = Point(-1, -1), //Point类型的anchor,锚的位置,其有默认值(-1,-1),表示锚位于中心
int iterations=1, //表示dilate的次数,默认值为1
int borderType = BORDER_CONSTANT, //用于推断图像外部像素某种边界模式,默认值为BORDER_DEFAULT
)
代码实现:
#include "pch.h"
#include <core.hpp>
#include <highgui.hpp>
#include <imgproc.hpp>
#include <opencv2/imgproc/types_c.h>
using namespace std;
using namespace cv;
int main()
{
//读取一张图片
Mat img=imread("D:\\Visual Studio project\\ConsoleApplication2\\风景.jpg");
//创建窗口
namedWindow("原图", WINDOW_NORMAL);
//将窗口调整成512*512
resizeWindow("原图", 512, 512);
//显示原图
imshow("原图",img);
//获取一个自定义的核,getStructuringElement表示cv中获取自定义核,MORPH_RECT核定义为方形,大小为10*10
Mat element = getStructuringElement(MORPH_RECT, Size(10, 10));
Mat after_dilate;
Mat after_erode;
//进行膨胀和腐蚀操作,2表示腐蚀2次
dilate(img, after_dilate, element, Point(-1, -1),2, BORDER_CONSTANT);
erode(img, after_erode, element,Point(-1,-1),2,BORDER_CONSTANT);
//创建新的窗口
namedWindow("膨胀图", WINDOW_NORMAL);
resizeWindow("膨胀图", 512, 512);
//显示膨胀图
imshow("膨胀图", after_dilate);
//再创建一个窗口
namedWindow("腐蚀图", WINDOW_NORMAL);
resizeWindow("腐蚀图", 512, 512);
//显示腐蚀图
imshow("腐蚀图", after_erode);
waitKey(0);
return 0;
}
输出结果:
参考文章:https://blog.csdn.net/qq_41553038/article/details/80048510