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,方便進(jìn)行腐蝕操作 6 7 int i, j, m, n; 8 BYTE flag; 9 for (rept = 0;rept < 3;rept++) //進(jìn)行三次 腐蝕 or 膨脹 操作 10 for (i = 1;i < h - 1;i++) 11 for (j = 1;j < w - 1;j++) 12 if (image[i * w + j] == 255) { //當(dāng)前灰度級為255時(即白色),則對該點(diǎn)的3x3鄰域像素點(diǎn)進(jìn)行遍歷 13 flag = 0;//記錄該鄰域中,當(dāng)灰度級為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)//當(dāng)鄰域中超過兩個像素點(diǎn)的灰度級都是0時,則該點(diǎn)的灰度級也為0(至此達(dá)成消除噪點(diǎn)的操作) 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,方便進(jìn)行膨脹操作 6 7 int i, j, m, n; 8 BYTE flag; 9 for (rept = 0;rept < 3;rept++)//進(jìn)行三次膨脹操作 10 for (i = 1;i < h - 1;i++) 11 for (j = 1;j < w - 1;j++) 12 if (image[i * w + j] == 0) {//當(dāng)前灰度級為0時(即黑色),則遍歷該點(diǎn)的3x3鄰域像素點(diǎn) 13 flag = 0;//紀(jì)錄該鄰域中,灰度級是255(即白色)的像素點(diǎn)個數(shù) 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)//當(dāng)鄰域中超過一個像素點(diǎn)的灰度級是255時,則該點(diǎn)的灰度級也為255(至此達(dá)成增強(qiáng)細(xì)節(jié),平滑處理的操作) 19 outImg[i * w + j] = 255; 20 } 21 memcpy(image, outImg, sizeof(BYTE) * w * h); 22 }
?
總結(jié)
針對處理二值圖圖像時,腐蝕或膨脹算法的核心:
1、確定該點(diǎn)(假設(shè)為A點(diǎn))的灰度級,是0還是255;
2、遍歷以該點(diǎn)為中心的3x3的鄰域,獲取灰度級等于0或者等于255的像素點(diǎn)個數(shù),使用 flag 變量記錄;文章來源:http://www.zghlxwxcb.cn/news/detail-746256.html
3、當(dāng) flag 大于設(shè)定的數(shù)值時,則A點(diǎn)的灰度級將被賦值為0或者255;文章來源地址http://www.zghlxwxcb.cn/news/detail-746256.html
到了這里,關(guān)于【C++】【圖像處理】形態(tài)學(xué)處理(腐蝕、膨脹)算法解析(以.raw格式的圖像為基礎(chǔ)進(jìn)行圖像處理、gray levels:256)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!