2020年8月31日 星期一

OpenCV erode、dilate(形態學處理)

當使用完二值化或邊緣偵測後,畫面總會殘留一些白點雜訊,或特徵會有破洞等狀況,為了不影響後續的辨識,這時可用型態學的方式,如侵蝕或膨脹將不想要的特徵給去除。

侵蝕

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

InputArray src:輸入影像
OutputArray dst:輸出影像
InputArray kernel:輸入核心
Point anchor:錨點位置
int iterations:疊代次數
nt borderType:邊界模式

膨脹

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

InputArray src:輸入影像
OutputArray dst:輸出影像
InputArray kernel:輸入核心
Point anchor:錨點位置
int iterations:疊代次數
nt borderType:邊界模式

但不論是侵蝕或膨脹,其預設的kernel都是3x3,如果想定義自己的kernel,可利用下列函示

Mat getStructuringElement(int shape, Size esize, Point anchor = Point(-1, -1));
int shape:元素形狀
Size esize:建構元素大小(kernal size)
Point anchor:錨點位置


程式碼如下:
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(){

	Mat SrcImg = imread("dog.jpg", CV_LOAD_IMAGE_COLOR);
	Mat GrayImg, BinaryImg;
	Mat ErodeImg, DilateImg, UserErodeImg, UserDilateImg;

	cvtColor(SrcImg, GrayImg, CV_BGR2GRAY);

	Mat Element = getStructuringElement(MORPH_ELLIPSE, Size(7, 7));
	erode(GrayImg, ErodeImg, Mat(), Point(-1, -1), 1);
	erode(GrayImg, UserErodeImg, Element, Point(-1, -1), 1);
	dilate(GrayImg, DilateImg, Mat(), Point(-1, -1), 1);
	dilate(GrayImg, UserDilateImg, Element, Point(-1, -1), 1);

	imshow("GrayImg", GrayImg);
	imshow("ErodeImg", ErodeImg);
	imshow("UserErodeImg", UserErodeImg);
	imshow("DilateImg", DilateImg);
	imshow("UserDilateImg", UserDilateImg);

	waitKey(0);
	return 0;
}

GrayImg

ErodeImg

UserErodeImg

DilateImg

UserDilateImg

沒有留言:

張貼留言