【matlab 图像处理】双边滤波&高斯滤波

【matlab 图像处理】双边滤波&高斯滤波

图像平滑

在图像的获取、传输和存储过程中常常会受到各种噪声的干扰和影响,使图像质量下降,为了获取高质量的数字图像,很有必要对图像进行消除噪声处理,并且尽可能地保持原始信息的完整性。

通常把抑制或消除图像中存在的噪声而改善图像质量的过程称为图像的平滑(ImageSmoothing)。图像平滑方法大致分为两大类:空域法和频域法。空域法主要借助模板运算,在像素点邻域内,利用噪声像素点特性进行滤波;频域法是指对图像进行正交变换,利用噪声对应高频信息的特点进行滤波。

高斯滤波

高斯滤波的基本原理是以某一像素为中心,在它的周围选择一个局部邻域,把邻域内像素的灰度按照高斯正态分布曲线进行统计,分配相应的权值系数,然后将邻域内所有点的加权平均值来代替原来的像素值,通过降低噪声点与周围像素点的差值以去除噪声点。

【matlab 图像处理】双边滤波&高斯滤波_第1张图片

典型的3x3 , 5x5的高斯模板如下:

【matlab 图像处理】双边滤波&高斯滤波_第2张图片

代码示例:

Image=imread('Letters-a.jpg');
sigma1=0.6; sigma2=10; r=3;  % 高斯模板的参数
NoiseI= imnoise(Image,'gaussian'); % 添加高斯噪声


% Fspecial函数用于创建预定义的滤波算子,其语法格式为:

% h = fspecial(type,parameters,sigma)
% 参数type制定算子类型,parameters指定相应的参数,具体格式为:
% type=‘average’,为均值滤波,参数为n,代表模版尺寸,用向量表示,默认值为[3,3]。
%type= ‘gaussian’,为高斯低通滤波器,参数有两个,n表示模版尺寸,默认值为[3,3],sigma表示滤波器的标准差,单位为像素,默认值为 0.5。
%type= ‘laplacian’,为拉普拉斯算子,参数为alpha,用于控制拉普拉斯算子的形状,取值范围为[0,1],默认值为0.2。
%type= ‘log’,为拉普拉斯高斯算子,参数有两个,n表示模版尺寸,默认值为[3,3],sigma为滤波器的标准差,单位为像素,默认值为0.5
%type= ‘prewitt’,为prewitt算子,用于边缘增强,无参数。
%type= ‘sobel’,为著名的sobel算子,用于边缘提取,无参数。
%type= ‘unsharp’,为对比度增强滤波器,参数alpha用于控制滤波器的形状,范围为[0,1],默认值为0.2。

gausFilter1=fspecial('gaussian',[2*r+1 2*r+1],sigma1);  
gausFilter2=fspecial('gaussian',[2*r+1 2*r+1],sigma2);  
result1=imfilter(NoiseI,gausFilter1,'conv');     % 对噪声图像进行高斯滤波
result2=imfilter(NoiseI,gausFilter2,'conv'); 
% 展示图像
imshow(Image);title('原图');
figure;imshow(NoiseI);title('高斯噪声图像');
figure;imshow(result1);title('sigma1 =0.6高斯滤波');
figure;imshow(result2);title('sigma2 =10高斯滤波');
%imwrite(uint8(NoiseI),'gr.bmp');
%imwrite(uint8(result1),'gr1.bmp');
%imwrite(uint8(result2),'gr2.bmp');
%编写高斯滤波函数实现
[height,width]=size(NoiseI);                                       
for x=-r:r
    for y=-r:r
        H(x+r+1,y+r+1)=1/(2*pi*sigma1^2).*exp((-x.^2-y.^2)/(2*sigma1^2));
    end
end 
H=H/sum(H(:));  %归一化高斯模板H  
result3=zeros(height,width);            %滤波后图像  
midimg=zeros(height+2*r,width+2*r);    %中间图像  
midimg(r+1:height+r,r+1:width+r)=NoiseI;  
for ai=r+1:height+r  
    for aj=r+1:width+r  
        temp_row=ai-r; 
        temp_col=aj-r;  
        temp=0;  
        for bi=1:2*r+1 
            for bj=1:2*r+1 
                temp= temp+(midimg(temp_row+bi-1,temp_col+bj-1)*H(bi,bj));  
            end  
        end  
       result3(temp_row,temp_col)=temp;  
    end  
end  
figure;imshow(uint8(result3));title('myself高斯滤波'); 


运行结果:

【matlab 图像处理】双边滤波&高斯滤波_第3张图片

程序运行结果如图所示。可以看出,标准差ɐ的取值对于滤波效果影响很大,对于一定尺寸的高斯滤波器,标准差。取值越大,图像越模糊。

双边滤波

高斯滤波平滑由于仅考虑了位置对中心像素的影响,会较明显地模糊边缘。为了能够在消除噪声的同时很好地保留边缘,双边滤波(Bilateral filter)是一种有效的方法。双边滤波是由Tomasi 和 Manduchi提出的一种非线性平滑滤波方法,具有非迭代、局部和简单等特性。“双边”则意味着平滑滤波时不仅考虑邻域内像素的空间邻近性,而且要考虑邻域内像素的灰度相似性。

简单地说,双边滤波就是一种局部加权平均。由于双边滤波比高斯滤波多了一个高斯方差,所以在边缘附近,距离较远的像素不会太多影响到边缘上的像素值,这样就保证边缘像素不会发生较大改变。

代码示例:

Image=im2double(imread('girl.bmp'));  
NoiseI= Image+0.05*randn(size(Image)); % 生成随机噪声
w=15;       % 定义双边滤波窗口宽度  
sigma_s=6; sigma_r=0.1; % 定义双边滤波窗口宽度及两个标准差参数  
[X,Y] = meshgrid(-w:w,-w:w); % meshgrid()函数适用于n维数据。它的目的就是根据x值数组和y值数组创建一个矩形坐标。类似于x轴和y轴,但是这个x轴、y轴的范围和精度都是自己设定的
Gs = exp(-(X.^2+Y.^2)/(2*sigma_s^2));%计算邻域内的空间权值
[hm,wn] = size(NoiseI); 
result=zeros(hm,wn); 
for i=1:hm    
    for j=1:wn  
        temp=NoiseI(max(i-w,1):min(i+w,hm),max(j-w,1):min(j+w,wn));
        Gr = exp(-(temp-NoiseI(i,j)).^2/(2*sigma_r^2)); %计算灰度邻近权值        
        % W为空间权值Gs和灰度权值Gr的乘积       
        W = Gr.*Gs((max(i-w,1):min(i+w,hm))-i+w+1,(max(j-w,1):min(j+w,wn))-j+w+1);      
        result(i,j)=sum(W(:).*temp(:))/sum(W(:));   % 生成双边滤波后的图像   
    end
end  
% 展示图象
subplot(1,3,1),imshow(Image),title('原始图像');  
subplot(1,3,2),imshow(NoiseI),title('随机噪声图像');   
subplot(1,3,3),imshow(result),title('双边滤波图像'); 
%imwrite(NoiseI,'ng1.bmp');
%imwrite(result,'ng2.bmp');

运行结果:

【matlab 图像处理】双边滤波&高斯滤波_第4张图片

在这里插入图片描述

你可能感兴趣的:(图像处理matlab,matlab,图像处理,计算机视觉)