圖像形態學操作—腐蝕膨脹深入

這裏我們主要想講解岡薩雷斯的數字圖像處理這本書上膨脹腐蝕的定義及用opencv實現的結果,然後對比它們之間的差異。

一:opencv實現

       在這之前可以看我的另外一篇blog:http://blog.csdn.net/lu597203933/article/details/17184439

膨脹:

案例代碼:

  1. int main()  
  2. {  
  3.     int a[8][8] = {  
  4.         {0,0,0,0,0,0,0,0},   
  5.         {0,0,5,1,0,0,1,1},   
  6.         {0,1,0,1,0,1,0,0},  
  7.         {0,1,1,2,1,0,1,0},  
  8.         {0,0,0,1,0,1,0,0},  
  9.         {0,1,0,0,0,0,0,1},  
  10.         {0,0,0,0,0,0,0,0},  
  11.         {0,0,0,0,0,0,0,0}  
  12.     };  
  13.     Mat S = Mat::zeros(8, 8, CV_8UC1);  
  14.     for(int j = 0; j < S.rows; j++)  
  15.     {  
  16.         for(int i = 0; i < S.cols; i++)  
  17.         {  
  18.             S.at<uchar>(j,i) = a[j][i];  
  19.         }  
  20.     }  
  21.     cout << "S = " << endl << " " << S << endl;  
  22.     Mat result;  
  23.     Mat dilated = Mat::zeros(3, 3, CV_8UC1);  
  24.     dilated.at<uchar>(0,1) = 1;  
  25.     //eroded.at<uchar>(0,2) = 1;  
  26.     dilated.at<uchar>(1,0) = 1;  
  27.     dilated.at<uchar>(1,1) = 2;          // 結構元素非0即1  
  28.     dilated.at<uchar>(1,2) = 1;  
  29.     dilated.at<uchar>(2,1) = 1;  
  30.     cout << "dilated = " << endl << " " << dilated << endl;     
  31.     dilate(S, result, dilated);    
  32.     cout << "result = " << endl << " " << result << endl;  
  33.     return 0;  
  34. }  

結果:


膨脹就是如果結構元B有一處非0,而A對應位置非0,則求出A中與B中對應非0處所有像素最大值來代替當前像素點值。Opencv中默認的結構元是3*3的矩陣,全部非0。

腐蝕:

案例代碼:

  1. int main()  
  2. {  
  3.     int a[8][8] = {  
  4.         {0,0,0,0,0,0,0,0},   
  5.         {0,0,5,1,0,0,1,1},   
  6.         {0,1,0,1,0,1,0,0},  
  7.         {0,1,1,2,1,0,1,0},  
  8.         {0,0,0,1,0,1,0,0},  
  9.         {0,1,0,0,0,0,0,1},  
  10.         {0,0,0,0,0,0,0,0},  
  11.         {0,0,0,0,0,0,0,0}  
  12.     };  
  13.     Mat S = Mat::zeros(8, 8, CV_8UC1);  
  14.     for(int j = 0; j < S.rows; j++)  
  15.     {  
  16.         for(int i = 0; i < S.cols; i++)  
  17.         {  
  18.             S.at<uchar>(j,i) = a[j][i];  
  19.         }  
  20.     }  
  21.     cout << "S = " << endl << " " << S << endl;  
  22.     Mat result;  
  23.     Mat eroded = Mat::zeros(3, 3, CV_8UC1);  
  24.     eroded.at<uchar>(0,1) = 1;  
  25.     //eroded.at<uchar>(0,2) = 1;  
  26.     eroded.at<uchar>(1,0) = 1;  
  27.     eroded.at<uchar>(1,1) = 2;          // 結構元素非0即1  
  28.     eroded.at<uchar>(1,2) = 1;  
  29.     eroded.at<uchar>(2,1) = 1;  
  30.     cout << "eroded = " << endl << " " << eroded << endl;   
  31.     erode(S, result, eroded);    
  32.     cout << "result = " << endl << " " << result << endl;  
  33.     return 0;  

結果:


腐蝕就是結構元B處非0,則A對應位置也全非0,且取全非0處最小值來代替當前像素點的值。

 

二:書中定義

膨脹: . 這裏的B是結構元,B~是結構元的反射,反射不明白可以看書,就是旋轉或者按中心點對稱。如:

0 1   的反射就是 1 1

1 1                        1 0

與opencv中唯一的區別就是必須得求反射,而opencv中則直接用給定的結構元B。

腐蝕: 

案例:



作者:小村長  出處:http://blog.csdn.net/lu597203933 歡迎轉載或分享,但請務必聲明文章出處。 (新浪微博:http://weibo.com/2653613245/profile , 歡迎交流!)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章