1 void erosion(BYTE* image, int w, int h, BYTE* outImg) 2 { 3 int rept; 4 //腐蝕 5 memcpy(outImg, image, sizeof(BYTE) * w * h); //將讀取的圖像賦值給outImg,方便進行腐蝕 ...
1 void erosion(BYTE* image, int w, int h, BYTE* outImg) 2 { 3 int rept; 4 //腐蝕 5 memcpy(outImg, image, sizeof(BYTE) * w * h); //將讀取的圖像賦值給outImg,方便進行腐蝕操作 6 7 int i, j, m, n; 8 BYTE flag; 9 for (rept = 0;rept < 3;rept++) //進行三次 腐蝕 or 膨脹 操作 10 for (i = 1;i < h - 1;i++) 11 for (j = 1;j < w - 1;j++) 12 if (image[i * w + j] == 255) { //當前灰度級為255時(即白色),則對該點的3x3鄰域像素點進行遍歷 13 flag = 0;//記錄該鄰域中,當灰度級為0(即黑色),則自增 14 for (m = -1;m < 2;m++) 15 for (n = -1;n < 2;n++) 16 if (image[(i + m) * w + j + n] == 0) { 17 flag++; 18 break; 19 } 20 if (flag > 2)//當鄰域中超過兩個像素點的灰度級都是0時,則該點的灰度級也為0(至此達成消除噪點的操作) 21 outImg[i * w + j] = 0; 22 } 23 memcpy(image, outImg, sizeof(BYTE) * w * h);// 保存處理好的圖像 24 25 }
1 void dilation(BYTE* image, int w, int h, BYTE* outImg) 2 { 3 int rept; 4 //膨脹 5 memcpy(outImg, image, sizeof(BYTE) * w * h); //將讀取的圖像賦值給outImg,方便進行膨脹操作 6 7 int i, j, m, n; 8 BYTE flag; 9 for (rept = 0;rept < 3;rept++)//進行三次膨脹操作 10 for (i = 1;i < h - 1;i++) 11 for (j = 1;j < w - 1;j++) 12 if (image[i * w + j] == 0) {//當前灰度級為0時(即黑色),則遍歷該點的3x3鄰域像素點 13 flag = 0;//紀錄該鄰域中,灰度級是255(即白色)的像素點個數 14 for (m = -1;m < 2;m++) 15 for (n = -1;n < 2;n++) 16 if (image[(i + m) * w + j + n] == 255) // 17 flag++; 18 if (flag > 1)//當鄰域中超過一個像素點的灰度級是255時,則該點的灰度級也為255(至此達成增強細節,平滑處理的操作) 19 outImg[i * w + j] = 255; 20 } 21 memcpy(image, outImg, sizeof(BYTE) * w * h); 22 }
總結
針對處理二值圖圖像時,腐蝕或膨脹演算法的核心:
1、確定該點(假設為A點)的灰度級,是0還是255;
2、遍歷以該點為中心的3x3的鄰域,獲取灰度級等於0或者等於255的像素點個數,使用 flag 變數記錄;
3、當 flag 大於設定的數值時,則A點的灰度級將被賦值為0或者255;