1. 程式人生 > >形態學運算:膨脹腐蝕

形態學運算:膨脹腐蝕

形態學運算:膨脹腐蝕

引言

影象處理–>空間域處理–>形態學運算。參考: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))

#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))

#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) 對二值影象進行操作可以將團塊的邊緣突出來。

#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  ;
}