高斯滤波C语言代码实现
时间: 2024-05-10 12:11:36 浏览: 167
高斯滤波是一种常用的图像处理方法,用于平滑图像并减少噪声。下面是一个简单的高斯滤波的C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
// 定义高斯函数
double gaussian(double x, double sigma) {
return exp(-(x * x) / (2 * sigma * sigma)) / (sqrt(2 * M_PI) * sigma);
}
// 高斯滤波函数
void gaussianFilter(int** image, int width, int height, double sigma) {
// 创建一个临时数组用于存储滤波后的图像
int** temp = (int**)malloc(height * sizeof(int*));
for (int i = 0; i < height; i++) {
temp[i] = (int*)malloc(width * sizeof(int));
}
// 定义高斯核
int kernelSize = 3;
double kernel = {
{1, 2, 1},
{2, 4, 2},
{1, 2, 1}
};
// 对每个像素进行滤波
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
double sum = 0;
double weightSum = 0;
// 对每个邻域像素进行加权求和
for (int j = -kernelSize / 2; j <= kernelSize / 2; j++) {
for (int i = -kernelSize / 2; i <= kernelSize / 2; i++) {
int neighborX = x + i;
int neighborY = y + j;
// 边界处理
if (neighborX >= 0 && neighborX < width && neighborY >= 0 && neighborY < height) {
double weight = kernel[j + kernelSize / 2][i + kernelSize / 2];
sum += image[neighborY][neighborX] * weight;
weightSum += weight;
}
}
}
// 对滤波后的像素进行归一化处理
temp[y][x] = (int)(sum / weightSum);
}
}
// 将滤波后的图像拷贝回原数组
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
image[i][j] = temp[i][j];
}
}
// 释放临时数组的内存
for (int i = 0; i < height; i++) {
free(temp[i]);
}
free(temp);
}
int main() {
// 假设原始图像是一个3x3的灰度图像
int width = 3;
int height = 3;
int** image = (int**)malloc(height * sizeof(int*));
for (int i = 0; i < height; i++) {
image[i] = (int*)malloc(width * sizeof(int));
}
// 初始化原始图像
image = 10;
image = 20;
image = 10;
image = 20;
image = 40;
image = 20;
image = 10;
image = 20;
image = 10;
// 执行高斯滤波
double sigma = 1.0;
gaussianFilter(image, width, height, sigma);
// 输出滤波后的图像
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
printf("%d ", image[i][j]);
}
printf("\n");
}
// 释放图像数组的内存
for (int i = 0; i < height; i++) {
free(image[i]);
}
free(image);
return 0;
}
```
这段代码实现了一个简单的高斯滤波,通过定义高斯核和对每个像素进行加权求和来实现平滑效果。你可以根据需要修改图像的大小、高斯核的大小和标准差来进行实验和调整。
阅读全文