學習計算機視覺最重要的能力應該就是編程了,為了幫助小夥伴儘快入門計算機視覺,小白準備了【OpenCV入門】系列。新的一年文章的內容進行了很大的完善,主要是借鑑了更多大神的文章,希望讓小夥伴更加容易理解。如果小夥伴覺得有幫助,請點擊一下文末的「在看」鼓勵一下小白。
膨脹與腐蝕(Dilation與Erosion)
圖像形態學操作
膨脹與腐蝕能實現多種多樣的功能,主要如下:
相關函數
getStructuringElement(int shape, Size ksize, Point anchor)
1. 形態學操作-膨脹跟卷積操作類似,假設有圖像A和結構元素B,結構元素B在A上面移動,其中B定義其中心為錨點,計算B覆蓋下A的最大像素值用來替換錨點的像素,其中B作為結構體可以是任意形狀
形態學操作-膨脹(感官上圖像變細,變白了)
相關函數
dilate(src, dst, kernel);
2. 形態學操作-腐蝕腐蝕跟膨脹操作的過程類似,唯一不同的是以最小值替換錨點重疊下圖像的像素值
形態學操作-腐蝕(感官上圖像變粗,變黑了)
相關函數
代碼示例
#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
using namespace cv;
using namespace std;
Mat src,erode_dst,dilate_dst;
char input_Win[]="input windows",dilate_Win[]="Dilation windows",Erode_Win[]="Erosion windows";
int dilate_elem=0,erode_elem=0;
int dilate_size=0,erode_size=0;
int const max_elem=2;
int const max_kernel_size=21;
void Dilation(int,void*);
void Erosion(int,void*);
int main(int argc,char** argv){
src = imread("E:/Experiment/OpenCV/Pictures/lenanoise.jpg");
if(src.empty()){
printf("Could not load Image ...");
return -1;
}
namedWindow(input_Win,CV_WINDOW_AUTOSIZE);
imshow(input_Win,src);
namedWindow(dilate_Win,CV_WINDOW_AUTOSIZE);
namedWindow(Erode_Win,CV_WINDOW_AUTOSIZE);
createTrackbar("卷積核類型",dilate_Win,&dilate_elem,max_elem,Dilation);
createTrackbar("卷積核大小",dilate_Win,&dilate_size,max_kernel_size,Dilation);
createTrackbar("卷積核類型",Erode_Win,&erode_elem,max_elem,Erosion);
createTrackbar("卷積核大小",Erode_Win,&erode_size,max_kernel_size,Erosion);
Dilation( 0, 0 );
Erosion( 0, 0 );
waitKey(0);
}
void Dilation(int,void*){
int dilate_type;
if(dilate_elem == 0){ dilate_type = MORPH_RECT; }
else if(dilate_elem == 1){ dilate_type = MORPH_CROSS; }
else if(dilate_elem == 2){ dilate_type = MORPH_ELLIPSE; }
Mat kernel = getStructuringElement(dilate_type,Size(2*dilate_size+1,2*dilate_size+1),Point(dilate_size,dilate_size));
dilate(src,dilate_dst,kernel);
imshow( dilate_Win, dilate_dst );
}
void Erosion(int,void*){
int erosion_type;
if(erode_elem == 0){ erosion_type = MORPH_RECT; }
else if(erode_elem == 1){ erosion_type = MORPH_CROSS; }
else if(erode_elem == 2){ erosion_type = MORPH_ELLIPSE; }
Mat kernel = getStructuringElement(erosion_type,Size(2*erode_size+1,2*erode_size+1),Point(erode_size,erode_size));
erode(src,erode_dst,kernel);
imshow( Erode_Win, erode_dst );
}
運行結果
先腐蝕後膨脹
可以去掉小的對象,假設對象是前景色,背景是黑色
先膨脹後腐蝕
可以填充小的洞,假設對象是前景色,背景是黑色
主要借鑑」Madcola「和」Micheal超「兩位大神的文章。兩位大神的博客主頁是:
https://www.cnblogs.com/skyfsm/(Madcola)
https://blog.csdn.net/qq_42887760(Micheal超)
由於時間和文章篇幅有限,本次總結先到這裡,下次小白會為小夥伴們帶來OpenCV的形態學操作的應用,各位小夥伴敬請期待。如果小夥伴覺得本文對自己有幫助,請幫忙點擊一下右下角的「在看」,鼓勵一下小白。