图像处理-空间域平滑滤波

目录:

1.       空间域和频域的概念

2.       图像滤波

3.       图像卷积

4.       常用空间域滤波器

5.       线性点运算

6.       均值滤波

7.       加权均值滤波

8.       高斯滤波

9.       阈值平均滤波


空间域和频域的概念

空间域与频率域为我们提供了不同的视角。在空间域中,函数自变量(x,y)被视为二维空间中的一个点,数字图像f(x,y)即为一个定义在二维空间中的矩形区域上的离散函数;换一个角度,如果将f(x,y)视为幅值变化的二维信号,则可以通过某些变换手段(如傅里叶变换、离散余弦变换、沃尔什变换和小波变换等)在频域下对图像进行处理了  因为在频率域就是一些特性比较突出,容易处理。比如在空间图像里不好找出噪声的模式,如果变换到频率域,则比较好找出噪声的模式,并能更容易的处理。

空间域 英文: spatial domain 释义: 又称图像空间(image space)。由图像像元组成的空间。在图像空间中以长度(距离)为自变量直接对像元值进行处理称为空间域处理。

频率域。 英文: spatial frequency domain 释义: 以频率(即波数)为自变量描述图像的特征,可以将一幅图像像元值在空间上的变化分解为具有不同振幅、空间频率和相位的简振函数的线性叠加,图像中各种频率成分的组成和分布称为空间频谱。这种对图像的频率特征进行分解、处理和分析称为频率域处理或波数域处理。


图像滤波

图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接响到后续图像处理和分析的有效性和可靠性。(滤波就是要去除没用的信息,保留有用的信息,可能是低频,也可能是高频)。

滤波的目1. 是抽出对象的特征作为图像识别的特征模式;  2. 为适应图像处理的要求,消除图像数字化时所混入的噪声。

滤波可分为空间域滤波可频域滤波,前者通过图像卷积运算实现,后者通过傅立叶变换实现。


图像卷积   

    卷积运算:可看作是加权求和的过程,使用到的图像区域中的每个像素分别于卷积核(权矩阵)的每个元素对应相乘,所有乘积之和作为区域中心像素的新值。

卷积核:卷积时使用到的权用一个矩阵表示,该矩阵是一个权矩阵。不同的卷积核对应不同的滤波器。

边界问题:当处理图像边界像素时,卷积核与图像使用区域不能匹配,卷积核的中心与边界像素点对应,卷积运算将出现问题。解决办法:1.复制边界,2.忽略边界,3.设定边界值。

卷积示例:

3 * 3 的像素区域R与卷积核G的卷积运算

1.jpg

R5(中心像素)=R1G1 + R2G2 + R3G3 + R4G4 + R5G5 + R6G6 + R7G7 + R8G8 + R9G9

代码实现:(对边缘不进行处理)

//kernel为float类型的卷积核
Mat ConvolutionOperation(Mat &src, Mat &kernel)
{
    Mat dst(src.rows, src.cols, src.type(), Scalar(0));
    if (src.channels() == 1)
    {
        int rowsSub = int(kernel.rows / 2);
        int colsSub = int(kernel.cols / 2);
        for (int i = 0; i < src.rows; i++) {
            for (int j = 0; j < src.cols; j++)
            {
                if (i < rowsSub || i >= src.rows - rowsSub || j < colsSub || j >= src.cols - colsSub) {
                    dst.at<uchar>(i, j) = src.at<uchar>(i, j);
                }
                else {
                    float sum = 0;
                    for (int ki = 0; ki < kernel.rows; ki++)
                    {
                        for (int kj = 0; kj < kernel.cols; kj++)
                        {
                            int i_ = i + ki - rowsSub;
                            int j_ = j + kj - colsSub;
                            sum += src.at<uchar>(i_, j_)*kernel.at<float>(ki, kj);
                        }
                    }
                    dst.at<uchar>(i, j) = int(sum);
                }
            }
        }
 
    }
    return dst;
}


常用的空间域滤波器

根据滤波的效果,空间域滤波可分为空间平滑滤波器和空间锐化滤波器。平滑滤波报告均值滤波、加权均值滤波、阈值平均滤波、中值滤波、高斯滤波等,应用时他们仅是卷积核之间的不同。

平滑滤波用于模糊处理和降低噪声。模糊处理常用于预处理任务中,如在目标提取之前去除图像中的一些琐碎细节,以及桥接直线或曲线的缝隙。通过线性或非线性平滑滤波也可降低噪声。

以下分别介绍各个滤波器。

 

线性点运算

对图像进行点运算
Mat LinearPointOperation_Float(Mat& src, double a, double b)
{
    Mat dst(src.rows, src.cols, src.type(), Scalar(0));
    if (src.channels() == 1)
        for (int i = 0; i < src.rows; i++) {
            for (int j = 0; j < src.cols; j++)
                dst.at<float>(i, j) = src.at<float>(i, j)*a+b;
    return dst;
}


 

空间域平滑滤波

1均值滤波

卷积核:

2.png

代码实现:

Mat MeanFiltering(Mat &src, int n)
{
    Mat one = Mat::ones(Size(9, 9), CV_32FC1);
    Mat kernel = LinearPointOperation_Float(one, 1 / 81.0, 0);
    Mat dst = ConvolutionOperation(src, kernel);
    return dst;
}


运行结果:

3.png

 

2.加权均值滤波

卷积核:

4.png

代码实现:

Mat WeightedMeanFiltering(Mat &src, Mat &kernel)
{
    Mat dst = ConvolutionOperation(src, kernel);
    return dst;
}


Mat WeightedKernel = (Mat_<float>(3, 3) << 1, 2, 1, 2, 4, 2, 1, 2, 1);   
Mat kernel = LinearPointOperation_Float(WeightedKernel, 1 / 16.0, 0);
Mat dst = WeightedMeanFiltering(img, kernel);

 

运行效果:

5.png

 

3. 高斯滤波器

一维高斯分布:

6.png

二维高斯分布:

7.png

高斯模板:

8.png

9.png


代码实现:

Mat GaussFiltering(Mat &src, Mat &kernel)
{
   Mat dst = ConvolutionOperation(src, kernel);
   return dst;
}
Mat GaussKernel = (Mat_<float>(5, 5) << 1, 4, 7, 4, 1, 4, 16, 26, 16,4,7,26,41,26,7,4,16,26,16,4,1,4,7,4,1);
Mat kernel = LinearPointOperation_Float(GaussKernel, 1 / 273.0, 0);
Mat dst = GaussFiltering(img, kernel);
imshow("dst", dst);

 

运行结果:

10.png

 

4. 阈值平均滤波

顾名思义,阈值平均滤波就是在平均滤波的基础上加上阈值的约束,即当像素点与图像均值的差小于设定的阈值时,输出像素点等于原像素点,否则求其对该像素点进行求模板均值。

代码实现:

求图像均值:

double ImageMean(Mat &src)
{
    long sum = 0;
    if (src.channels() == 1) {
        for (int i = 0; i < src.rows; i++) 
        {
            uchar *srcRow = src.ptr(i);
            for (int j = 0; j < src.cols; j++)
                sum += srcRow[j];
        }
    }
    return double(sum*1.0 / (src.cols*src.rows));
}


实现阈值均值滤波:

Mat ThresholdMeanFiltering(Mat &src,int n,int thre)
{
    //获得卷积核
    Mat kernel = Mat::ones(Size(n, n), CV_32FC1);
    kernel = LinearPointOperation_Float(kernel, 1 / (1.0*n*n), 0);
    //创建输出图像
    Mat dst(src.rows, src.cols, src.type(), Scalar(0));
    if (src.channels() == 1)
    {
        double m = ImageMean(src);//计算出图像均值
        int rowsSub = int(kernel.rows / 2);
        int colsSub = int(kernel.cols / 2);
        for (int i = 0; i < src.rows; i++) {
            for (int j = 0; j < src.cols; j++)
            {
                if (i < rowsSub || i >= src.rows - rowsSub || j < colsSub || j >= src.cols - colsSub) {
                    dst.at<uchar>(i, j) = src.at<uchar>(i, j);
                }
                else {
                    if (abs(src.at<uchar>(i, j)-m) < thre)
                        dst.at<uchar>(i, j) = src.at<uchar>(i, j);
                    else {
                        float sum = 0;
                        for (int ki = 0; ki < kernel.rows; ki++)
                        {
                            for (int kj = 0; kj < kernel.cols; kj++)
                            {
                                int i_ = i + ki - rowsSub;
                                int j_ = j + kj - colsSub;
                                sum += src.at<uchar>(i_, j_)*kernel.at<float>(ki, kj);
                            }
                        }
                        dst.at<uchar>(i, j) = int(sum);
                    }
                }
            }
        }
 
    }
    return dst;
}


当输入n=5,thre=50时,运行结果:

11.png

 

参考文献

[1] CSDN博客:yeler082. 图像处理技术上的空间域和空间频率域.

https://blog.csdn.net/yeler082/article/details/78374818. 2017-10-28

[2] CSDN博客:John9ML. 图像处理基本概念——卷积,滤波,平滑.

https://blog.csdn.net/weixin_38570251/article/details/82054185. 2018-08-25.

[3] 韩九强,杨磊.数字图像处理.西安交通大学出版社.2018-08

 


首页 所有文章 机器人 计算机视觉 自然语言处理 机器学习 编程随笔 关于