OpenCV学习笔记(七):形态学morpholgy(1):腐蚀/膨胀:enrode(),dilate()
OpenCV學習筆記(七):形態學(morpholgy):腐蝕/膨脹:enrode(),dilate()
數學形態學(Mathematical morphology) 是一門建立在格論和拓撲學基礎之上的圖像分析學科,是數學形態學圖像處理的基本理論。其基本的運算包括:二值腐蝕和膨脹、二值開閉運算、骨架抽取、極限腐蝕、擊中擊不中變換、形態學梯度、Top-hat變換、顆粒分析、流域變換、灰值腐蝕和膨脹、灰值開閉運算、灰值形態學梯度等。
簡單來講,形態學操作就是基于形狀的一系列圖像處理操作。膨脹與腐蝕能實現多種多樣的功能,主要如下:
1.消除噪聲
2.分割(isolate)出獨立的圖像元素,在圖像中連接(join)相鄰的元素。
3.尋找圖像中的明顯的極大值區域或極小值區域
4.求出圖像的梯度
一、膨脹就是求局部最大值的操作
按數學方面來說,膨脹或者腐蝕操作就是將圖像(或圖像的一部分區域,我們稱之為A)與核(我們稱之為B)進行卷積。
核可以是任何的形狀和大小,它擁有一個單獨定義出來的參考點,我們稱其為錨點(anchorpoint)。多數情況下,核是一個小的中間帶有參考點和實心正方形或者圓盤,其實,我們可以把核視為模板或者掩碼。
而膨脹就是求局部最大值的操作,核B與圖形卷積,即計算核B覆蓋的區域的像素點的最大值,并把這個最大值賦值給參考點指定的像素。這樣就會使圖像中的高亮區域逐漸增長。
二、腐蝕就是求局部最小值的操作。
膨脹和腐蝕是一對好基友,是相反的一對操作,所以腐蝕就是求局部最小值的操作。
代碼:
#include <opencv2/opencv.hpp>using namespace cv; using namespace std;Mat g_srcImage, g_dstImage; //原始圖和效果圖 int g_nTrackbarNumer = 1; //0表示腐蝕erode, 1表示膨脹dilate int g_nStructElementSize = 7; //結構元素(內核矩陣)的尺寸int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);// 1、載入原圖if(g_nTrackbarNumer==0)g_srcImage = imread("F:/C++/2. OPENCV 3.1.0/TEST/erode.jpg");elseg_srcImage = imread("F:/C++/2. OPENCV 3.1.0/TEST/dilate.png");if( !g_srcImage.data ) { printf("讀取srcImage錯誤~! \n"); return false; }// 2、顯示原始圖namedWindow("【原始圖】");imshow("【原始圖】", g_srcImage);// 3、進行初次腐蝕操作并顯示效果圖(初始化顯示)namedWindow("【效果圖】");Process();// 4、創建軌跡條createTrackbar("腐蝕/膨脹", "【效果圖】", &g_nTrackbarNumer, 1, on_TrackbarNumChange); // 切換開關createTrackbar("內核尺寸", "【效果圖】", &g_nStructElementSize, 21, on_ElementSizeChange); // 內核大小改變// 5、輸出一些幫助信息cout<<endl<<"\t運行成功,請調整滾動條觀察圖像效果~\n\n"<<"\t按下“q”鍵時,程序退出。\n";//輪詢獲取按鍵信息,若下q鍵,程序退出while(char(waitKey(1)) != 'q') {}return a.exec(); }1)自定義的腐蝕或膨脹處理函數
void Process() {// 1、獲取自定義核Mat element = getStructuringElement(MORPH_ELLIPSE, Size(2*g_nStructElementSize+1, 2*g_nStructElementSize+1),Point(-1,-1));// 2、進行腐蝕或膨脹操作if(g_nTrackbarNumer == 0){erode(g_srcImage, g_dstImage, element);}else{dilate(g_srcImage, g_dstImage, element);}// 3、顯示效果圖imshow("【效果圖】", g_dstImage); }2)切換開關 回調函數
void on_TrackbarNumChange(int, void *) {//腐蝕和膨脹之間效果已經切換,回調函數體內需調用一次Process函數,使改變后的效果立即生效并顯示出來Process(); }3)內核調整 回調函數
void on_ElementSizeChange(int, void *) {//內核尺寸已改變,回調函數體內需調用一次Process函數,使改變后的效果立即生效并顯示出來Process(); }結果:
erode
dilate
總結
以上是生活随笔為你收集整理的OpenCV学习笔记(七):形态学morpholgy(1):腐蚀/膨胀:enrode(),dilate()的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: react打包后图片丢失_使用 webp
- 下一篇: MATLAB(五)在线性代数中的应用