引言
图像处理–>空间域处理–>形态学运算。参考:opencv3毛星云老师。
1、膨胀腐蚀
膨胀: 膨胀是图像中的高亮部分进行膨胀, 类似于领域扩张。
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main( )
{
//载入原图
Mat image = imread("1.jpg");
//创建窗口
namedWindow("【原图】膨胀操作");
namedWindow("【效果图】膨胀操作");
//显示原图
imshow("【原图】膨胀操作", image);
//进行膨胀操作
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
Mat out;
dilate(image, out, element);
//显示效果图
imshow("【效果图】膨胀操作", out);
waitKey(0);
return 0;
}

腐蚀: 腐蚀是原图的高亮部分被腐蚀, 类似于领域被蚕食。
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main( )
{
//载入原图
Mat srcImage = imread("1.jpg");
//显示原图
imshow("【原图】腐蚀操作", srcImage);
//进行腐蚀操作
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
Mat dstImage;
erode(srcImage, dstImage, element);
//显示效果图
imshow("【效果图】腐蚀操作", dstImage);
waitKey(0);
return 0;
}

2、开运算闭运算
开运算: 先腐蚀再膨胀, 可以去掉目标外的孤立点。 d s t = o p e n ( s r c , e l e m e n t ) = d i l a t e ( e r o d e ( s r c , e l e m e n t ) ) dst=open(src,element)=dilate(erode(src,element)) dst=open(src,element)=dilate(erode(src,element))
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main( )
{
//载入原始图
Mat image = imread("1.jpg");
//创建窗口
namedWindow("【原始图】开运算");
namedWindow("【效果图】开运算");
//显示原始图
imshow("【原始图】开运算", image);
//定义核
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
//进行形态学操作
morphologyEx(image, image, MORPH_OPEN, element);
//显示效果图
imshow("【效果图】开运算", image);
waitKey(0);
return 0;
}

闭运算: 先膨胀再腐蚀, 可以去掉目标内的孔。 d s t = c l e s e ( s r c , e l e m e n t ) = e r o d e ( d i l a t e ( s r c , e l e m e n t ) ) dst=clese(src,element)=erode(dilate(src,element)) dst=clese(src,element)=erode(dilate(src,element))
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main( )
{
//载入原始图
Mat image = imread("1.jpg");
//创建窗口
namedWindow("【原始图】闭运算");
namedWindow("【效果图】闭运算");
//显示原始图
imshow("【原始图】闭运算", image);
//定义核
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
//进行形态学操作
morphologyEx(image, image, MORPH_CLOSE, element);
//显示效果图
imshow("【效果图】闭运算", image);
waitKey(0);
return 0;
}

通常, 当有噪声的图像用阈值二值化后, 所得到的边界是很不平滑的, 物体区域具有一些错判的孔洞, 背景区域散布着一些小的噪声物体, 连续的开和闭运算可以显著的改善这种情况。
形态学梯度: 膨胀图与腐蚀图之差,
d
s
t
=
m
o
r
p
h
−
g
r
a
d
(
s
r
c
,
e
l
e
m
e
n
t
)
=
d
i
l
a
t
e
(
s
r
c
,
e
l
e
m
e
n
t
)
−
e
r
o
d
e
(
s
r
c
,
e
l
e
m
e
n
t
)
dst=morph-grad(src,element)=dilate(src,element)-erode(src,element)
dst=morph−grad(src,element)=dilate(src,element)−erode(src,element)对二值图像进行操作可以将团块的边缘突出来。
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main( )
{
//载入原始图
Mat image = imread("1.jpg");
//创建窗口
namedWindow("【原始图】形态学梯度");
namedWindow("【效果图】形态学梯度");
//显示原始图
imshow("【原始图】形态学梯度", image);
//定义核
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
//进行形态学操作
morphologyEx(image, image, MORPH_GRADIENT, element);
//显示效果图
imshow("【效果图】形态学梯度", image);
waitKey(0);
return 0;
}

3、顶帽黑帽运算
顶帽
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main( )
{
//载入原始图
Mat image = imread("1.jpg");
//创建窗口
namedWindow("【原始图】顶帽运算");
namedWindow("【效果图】顶帽运算");
//显示原始图
imshow("【原始图】顶帽运算", image);
//定义核
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
//进行形态学操作
morphologyEx(image, image, MORPH_TOPHAT, element);
//显示效果图
imshow("【效果图】顶帽运算", image);
waitKey(0);
return 0;
}

黑帽
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main( )
{
//载入原始图
Mat image = imread("1.jpg");
namedWindow("【原始图】黑帽运算");
namedWindow("【效果图】黑帽运算");
//显示原始图
imshow("【原始图】黑帽运算", image);
//定义核
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
//进行形态学操作
morphologyEx(image, image, MORPH_BLACKHAT, element);
//显示效果图
imshow("【效果图】黑帽运算", image);
waitKey(0);
return 0 ;
}
