形态学运算:膨胀腐蚀
引言
图像处理–>空间域处理–>形态学运算。参考: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、开运算闭运算
开运算: 先腐蚀再膨胀, 可以去掉目标外的孤立点。
#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;
}
闭运算: 先膨胀再腐蚀, 可以去掉目标内的孔。
#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;
}
通常, 当有噪声的图像用阈值二值化后, 所得到的边界是很不平滑的, 物体区域具有一些错判的孔洞, 背景区域散布着一些小的噪声物体, 连续的开和闭运算可以显著的改善这种情况。
形态学梯度: 膨胀图与腐蚀图之差,对二值图像进行操作可以将团块的边缘突出来。
#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 ;
}