OpenCV(6)-腐蝕和膨脹


腐蝕和膨脹屬於形態學操作。

腐蝕和膨脹

腐蝕是指:將卷積核B滑過圖像A,找出卷積核區域內最小像素值作為錨點像素值。這一操作可以擴大低像素值區域。
膨脹是指:將卷積核B滑過圖像A,找出卷積核區域內最大像素值作為錨點像素值。這一操作可以縮小低像素值區域。

通過前面的卷積可以看出,膨脹相當於“最大值”濾波器,腐蝕相當於”最小值“濾波器。濾波器的形狀我們可以自己定義。

其他形態學操作

開運算

先對圖像腐蝕,再膨脹

\[\texttt{dst} = \mathrm{open} ( \texttt{src} , \texttt{element} )= \mathrm{dilate} ( \mathrm{erode} ( \texttt{src} , \texttt{element} )) \]

閉運算

先膨脹再腐蝕

\[\texttt{dst} = \mathrm{close} ( \texttt{src} , \texttt{element} )= \mathrm{erode} ( \mathrm{dilate} ( \texttt{src} , \texttt{element} )) \]

形態梯度

膨脹圖和腐蝕圖之差

\[\texttt{dst} = \mathrm{morph\_grad} ( \texttt{src} , \texttt{element} )= \mathrm{dilate} ( \texttt{src} , \texttt{element} )- \mathrm{erode} ( \texttt{src} , \texttt{element} ) \]

頂冒

原圖和開運算圖之差

\[\texttt{dst} = \mathrm{tophat} ( \texttt{src} , \texttt{element} )= \texttt{src} - \mathrm{open} ( \texttt{src} , \texttt{element} ) \]

黑冒

閉運算結果和原圖之差

\[\texttt{dst} = \mathrm{blackhat} ( \texttt{src} , \texttt{element} )= \mathrm{close} ( \texttt{src} , \texttt{element} )- \texttt{src} \]

實驗代碼

常用函數

Mat getStructuringElement(int shape, Size ksize, Point anchor=Point(-1,-1))

獲取卷積核,卷積核中,對應形狀位置的元素都為1.
shape:
MORPH_RECT:矩形
MORPH_ELLIPSE:橢圓
MORPH_CROSS:十字形

ksize:
核大小

void morphologyEx(InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() )

src:輸入圖像
dst:結果圖像
op:操作MORPH_OPEN開運算,MORPH_CLOSE閉運算、MORPH_GRADIENT形態梯度、MORPH_TOPHAT釘帽、MORPH_BLACKHAT黑冒

代碼

#include <iostream>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>


using namespace cv;
using namespace std;

int main(int argc, char* argv[]){
	const char* path = "";
	Mat img = imread(path);
	if (!img.data){
		cout << "Wrong Image" << endl;
		return -1;
	}

	Mat kern = getStructuringElement(MORPH_RECT, Size(5, 5));

	Mat erosion_img, dilate_img;
	//腐蝕
	erode(img, erosion_img, kern);
	//膨脹
	dilate(img, dilate_img, kern);

	imshow("original image", img);
	imshow("erosion image", erosion_img);
	imshow("dilate image", dilate_img);


	Mat open_mat, close_mat, gradient_mat, tophat_mat, blackhat_mat;
	morphologyEx(img, open_mat, MORPH_OPEN, kern);
	morphologyEx(img, close_mat, MORPH_CLOSE, kern);
	morphologyEx(img, gradient_mat, MORPH_GRADIENT, kern);
	morphologyEx(img, tophat_mat, MORPH_TOPHAT, kern);
	morphologyEx(img, blackhat_mat, MORPH_BLACKHAT, kern);

	imshow("Opening", open_mat);
	imshow("Closing", close_mat);
	imshow("Grandient", gradient_mat);
	imshow("Tohat", tophat_mat);
	imshow("Black", blackhat_mat);

	cvWaitKey(0);
	return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM