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 //将输出图像边缘的像素值设为 020 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.0f30 }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 148 1 1 149 1 1 150 51 0 0 052 0 x y53 0 j k54 */55 56 return value;57 58 }
低通滤波和直方图均衡核心点:按照一定的 权重 / 均分比例 处理 一定区域 / 数量上的像素点上的灰度级值。
总结:均值和高斯滤波(低通)的核心,创建卷积核并确定各个点上的权重,然后将边缘灰度级归零,提取非边缘像素点的3×3区域的像素级,最后计算卷积结果再输出。