高斯滤波器

发布时间 2023-07-16 10:10:21作者: flxx

高斯滤波器(Gaussian filter)是一种常用的图像处理滤波器,用于平滑图像并减少图像中的噪声。它基于高斯函数的概念,通过对图像中的每个像素点进行加权平均来实现平滑效果。

高斯函数是一个钟形曲线,具有一个中心点和一个标准差。在高斯滤波器中,中心点周围的像素点会被加权平均,而离中心点越远的像素点权重越小。这样做的效果是,中心点的像素值会受到周围像素的影响,从而实现平滑的效果。

高斯滤波器的工作原理是将每个像素点与周围像素点进行加权平均。权重是根据高斯函数计算得到的,距离中心点越远的像素点的权重越小。通过调整高斯函数的标准差,可以控制滤波器的平滑程度。较大的标准差会导致更强的平滑效果,但可能会模糊图像细节。

高斯滤波器在图像处理中有广泛的应用,常用于去除图像中的噪声、平滑边缘、图像降噪等任务。它是一种线性滤波器,计算简单且效果良好,因此被广泛采用。

下面是一个使用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 size = 2 * ceil(3 * sigma) + 1;  // 计算滤波器大小

    // 创建滤波器
    double** filter = (double**)malloc(size * sizeof(double*));
    for (int i = 0; i < size; i++) {
        filter[i] = (double*)malloc(size * sizeof(double));
    }

    // 计算滤波器权重
    double sum = 0.0;
    int radius = size / 2;
    for (int i = -radius; i <= radius; i++) {
        for (int j = -radius; j <= radius; j++) {
            filter[i + radius][j + radius] = gaussian(sqrt(i * i + j * j), sigma);
            sum += filter[i + radius][j + radius];
        }
    }

    // 归一化滤波器权重
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            filter[i][j] /= sum;
        }
    }

    // 创建临时图像存储滤波结果
    int** tempImage = (int**)malloc(height * sizeof(int*));
    for (int i = 0; i < height; i++) {
        tempImage[i] = (int*)malloc(width * sizeof(int));
    }

    // 对每个像素点进行滤波
    for (int i = radius; i < height - radius; i++) {
        for (int j = radius; j < width - radius; j++) {
            double sum = 0.0;
            for (int k = -radius; k <= radius; k++) {
                for (int l = -radius; l <= radius; l++) {
                    sum += filter[k + radius][l + radius] * image[i + k][j + l];
                }
            }
            tempImage[i][j] = (int)sum;
        }
    }

    // 将滤波结果复制回原图像
    for (int i = radius; i < height - radius; i++) {
        for (int j = radius; j < width - radius; j++) {
            image[i][j] = tempImage[i][j];
        }
    }

    // 释放内存
    for (int i = 0; i < size; i++) {
        free(filter[i]);
    }
    free(filter);

    for (int i = 0; i < height; i++) {
        free(tempImage[i]);
    }
    free(tempImage);
}

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[0][0] = 1;
    image[0][1] = 2;
    image[0][2] = 3;
    image[1][0] = 4;
    image[1][1] = 5;
    image[1][2] = 6;
    image[2][0] = 7;
    image[2][1] = 8;
    image[2][2] = 9;

    // 打印原始图像
    printf("Original Image:\n");
    for (int i = 0; i < height; i++) {
        for (int j = 0; j < width; j++) {
            printf("%d ", image[i][j]);
        }
        printf("\n");
    }
    printf("\n");

    // 使用高斯滤波器对图像进行滤波
    double sigma = 1.0;
    gaussianFilter(image, width, height, sigma);

    // 打印滤波后的图像
    printf("Filtered Image:\n");
    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;
}

/* output
Original Image:
1 2 3 
4 5 6 
7 8 9 

Filtered Image:
1 2 3 
4 5 6 
7 8 9 
*/

这段代码演示了一个简单的3x3图像的高斯滤波过程。你可以根据实际需求修改图像的大小和像素值,并调整高斯滤波器的参数。在代码中,高斯滤波器的标准差(sigma)被设置为1.0,你可以根据需要进行调整。