图像的形态学梯度是膨胀图与腐蚀图之差,数学表达式是:
dst = grad(sec, element) = dilate(src, element) - erode(src, element)
对二值图进行这一操作可以得到图像中白色区域的边界,因此可以用形态学梯度来保留物体的边界轮廓。
同样有两种方法实现,代码示例:
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
int main() {
Mat srcImage;
srcImage = imread("/Users/dwz/Desktop/cpp/b.jpg");
Mat element;
element = getStructuringElement(MORPH_RECT, Size(5, 5));
Mat dstImage;
// 第一种实现方法
morphologyEx(srcImage, dstImage, MORPH_GRADIENT, element);
// 第二种实现方法
// Mat dilateImage, erodeImage;
// dilate(srcImage, dilateImage, element);
// erode(srcImage, erodeImage, element);
// dstImage = dilateImage - erodeImage;
imwrite("gradient.jpg", dstImage);
return 0;
}
输入;
输出: