基于C++实现高斯滤波
时间: 2023-11-14 18:08:15 浏览: 167
高斯滤波是一种图像处理算法,可以平滑图像并减少噪声。它基于高斯函数,通过对图像中每个像素及其周围像素的加权平均值进行计算来实现。
以下是基于C语言实现高斯滤波的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_IMAGE_WIDTH 1024
#define MAX_IMAGE_HEIGHT 1024
int image[MAX_IMAGE_HEIGHT][MAX_IMAGE_WIDTH]; // 图像数组
float gaussianKernel[5][5] = { // 高斯核
{0.003, 0.013, 0.022, 0.013, 0.003},
{0.013, 0.059, 0.097, 0.059, 0.013},
{0.022, 0.097, 0.159, 0.097, 0.022},
{0.013, 0.059, 0.097, 0.059, 0.013},
{0.003, 0.013, 0.022, 0.013, 0.003}
};
int Clamp(int value, int min, int max) { // 限制像素值在最大值和最小值之间
if(value < min) {
return min;
} else if(value > max) {
return max;
} else {
return value;
}
}
int main() {
int imageWidth;
int imageHeight;
int row, col, i, j;
int sum;
int kernelSize = 5; // 高斯核大小
// 读取图像
FILE* fp = fopen("input.raw", "rb");
fread(&imageWidth, sizeof(int), 1, fp);
fread(&imageHeight, sizeof(int), 1, fp);
fread(image, sizeof(int), imageWidth*imageHeight, fp);
fclose(fp);
// 对每个像素应用高斯滤波
for(row = 0; row < imageHeight; row++) {
for(col = 0; col < imageWidth; col++) {
sum = 0;
for(i = -kernelSize/2; i <= kernelSize/2; i++) {
for(j = -kernelSize/2; j <= kernelSize/2; j++) {
sum += (int)(gaussianKernel[i+kernelSize/2][j+kernelSize/2] * (float)image[Clamp(row+i, 0, imageHeight-1)][Clamp(col+j, 0, imageWidth-1)]);
}
}
image[row][col] = sum;
}
}
// 保存图像
fp = fopen("output.raw", "wb");
fwrite(&imageWidth, sizeof(int), 1, fp);
fwrite(&imageHeight, sizeof(int), 1, fp);
fwrite(image, sizeof(int), imageWidth*imageHeight, fp);
fclose(fp);
return 0;
}
```
该代码会读取名为“input.raw”的原始图像,并将处理后的图像保存到名为“output.raw”的文件中。注意,该代码仅支持灰度图像,如果您要处理彩色图像,则需要将其转换为灰度图像。
阅读全文