- 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 }
复制代码
低通滤波和直方图均衡核心点:按照一定的 权重 / 均分比例 处理 一定区域 / 数量上的像素点上的灰度级值。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |