C语言使用一维高斯滤波器去除噪声,给出全部代码
时间: 2024-09-12 14:12:36 浏览: 39
C语言中,我们可以使用一维高斯滤波器来平滑图像并去除噪声。下面是一个简单的实现,它假设你有一个二维数组(图像)`input_image`,并且你想应用一个3x3的标准高斯核(大小可以根据需求调整):
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
// 定义高斯核函数
double gaussian(int x, int y, int kernel_size, double sigma) {
double sum = 0;
const double pi = M_PI;
for (int i = -kernel_size; i <= kernel_size; ++i) {
for (int j = -kernel_size; j <= kernel_size; ++j) {
double distance = pow(i, 2) + pow(j, 2);
sum += exp(-distance / (2 * pow(sigma, 2))) / (2 * pi * pow(sigma, 2));
}
}
return sum;
}
// 使用高斯滤波器
void apply_gaussian_filter(int* input_image, int width, int height, double kernel_size, double sigma, int* output_image) {
for (int y = 0; y < height; ++y) {
for (int x = 0; x < width; ++x) {
double sum = 0;
for (int i = -kernel_size; i <= kernel_size; ++i) {
for (int j = -kernel_size; j <= kernel_size; ++j) {
int neighbor_index = (y + i >= 0 && y + i < height) ? y + i : height - 1;
int pixel_index = (x + j >= 0 && x + j < width) ? x + j : width - 1;
sum += gaussian(i, j, kernel_size, sigma) * input_image[pixel_index];
}
}
output_image[x] = round(sum); // 四舍五入到整数
}
}
}
// 示例用法
int main() {
int input_width = 100;
int input_height = 100;
int* input_image = malloc(input_width * input_height * sizeof(int)); // 假设已填充输入图像数据
int* output_image = malloc(input_width * input_height * sizeof(int));
// 运行高斯滤波
apply_gaussian_filter(input_image, input_width, input_height, 3, 1.5, output_image);
// 输出处理后的图像
for (int y = 0; y < input_height; ++y) {
for (int x = 0; x < input_width; ++x) {
printf("%d ", output_image[x]);
}
printf("\n");
}
free(input_image);
free(output_image);
return 0;
}
```
这段代码首先定义了一个高斯核函数,然后在一个嵌套循环中计算每个像素点周围邻居像素与高斯核权重的乘积,最后累加得到平滑后的结果。
阅读全文