1 void meanFilter(BYTE* image, int width, int height, BYTE* outImg) 2 { 3 //均值濾波 4 int smth[9]; 5 int i, j, m, n; 6 BYTE block[9]; 7 8 // 高斯捲積核初始化 9 s ...
1 void meanFilter(BYTE* image, int width, int height, BYTE* outImg) 2 { 3 //均值濾波 4 int smth[9]; 5 int i, j, m, n; 6 BYTE block[9]; 7 8 // 高斯捲積核初始化 9 smth[0] = 1, smth[1] = 2, smth[2] = 1, 10 smth[3] = 2, smth[4] = 4, smth[5] = 2, 11 smth[6] = 1, smth[7] = 2, smth[8] = 1; 12 13 int value; 14 for (i = 0;i < 9;i++) //初始化均值捲積核 15 smth[i] = 1; 16 17 for (i = 0;i < height;i++) 18 for (j = 0;j < width;j++) { 19 //將輸出圖像邊緣的像素值設為 0 20 if (i == 0 || j == 0 || i == height - 1 || j == width - 1) 21 outImg[i * width + j] = 0; 22 23 //提取以當前像素為中心的 3x3 區域的像素值,然後利用捲積操作計算這個區域的均值,最後將計算得到的均值作為輸出圖像中對應位置的像素值 24 else { 25 for (m = -1;m < 2;m++) 26 for (n = -1;n < 2;n++) 27 block[(m + 1) * 3 + n + 1] = image[(i + m) * width + j + n]; 28 value = convolution(smth, block); 29 outImg[i * width + j] = BYTE(value / 9.0f); // 高斯為 value / 16.0f 30 } 31 } 32 33 } 34 35 36 int convolution(int* operatr, BYTE* block) 37 { 38 int value; 39 int i, j; 40 value = 0; 41 //捲積運算 42 //遍歷 3x3 區域內的每個像素,並根據捲積核的權重計算出捲積結果 43 for (i = 0;i < 3;i++) 44 for (j = 0;j < 3;j++) 45 value += operatr[i * 3 + j] * block[i * 3 + j]; 46 /* 47 1 1 1 48 1 1 1 49 1 1 1 50 51 0 0 0 52 0 x y 53 0 j k 54 */ 55 56 return value; 57 58 }
低通濾波和直方圖均衡核心點:按照一定的 權重 / 均分比例 處理 一定區域 / 數量上的像素點上的灰度級值。
總結:均值和高斯濾波(低通)的核心,創建捲積核並確定各個點上的權重,然後將邊緣灰度級歸零,提取非邊緣像素點的3x3區域的像素級,最後計算捲積結果再輸出。