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