形態學運算:膨脹腐蝕
阿新 • • 發佈:2018-11-01
形態學運算:膨脹腐蝕
引言
影象處理–>空間域處理–>形態學運算。參考: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 ;
}