数字滤波器实现磨皮效果

目录

一、Matlab 中图像的读取方法

二、观察图像频域波形

三、滤除不同频率分量得到不同效果

1.高斯低通滤波器

2.双边滤波器


一、Matlab 中图像的读取方法

在Matlab中,我们可以使用imread函数来读取图像。以下是读取图像的步骤:

1.需要确保图像文件保存在Matlab的当前工作目录中,或者知道文件的完整路径。

2.通过imread函数,并将图像文件的名称作为输入参数,例如:

img = imread('image.jpg');

这步操作可以读取名为'imagejpg'的图像文件,并将其存储在变量img中。

3用imshow函数来显示图像。例如:imshow(img);

并且,在读取图像之前,需要确保Matlab可以找到该图像文件,并使用正确的文件路径和文件名输入到imread函数中。

本文以“罗中立 父亲.jpg"为例,读入图像代码如下:

close all;
clear all;
clc;
I = imread('罗中立 父亲.jpg');
% I=rgb2gray(I);//将图像转换成灰度图

二、观察图像频域波形

图像的频域看法:

低频成分: 在频域波形的中心通常代表着图像中的低频成分,这些成分对应着图像中的整体结构和轮廓信息。

高频成分: 频域波形的边缘部分通常代表着图像中的高频成分,这些成分对应着图像中的细节和纹理信息。

能量分布: 波形的亮度表示了在对应频率下的能量大小,更亮的区域通常表示有更多的能量。

% 对图像进行傅里叶变换
fftImage = fft2(Image);
% 将零频分量移到频谱中心
fftImage = fftshift(fftImage);
% 计算幅度谱
amplitudeSpectrum = log(abs(fftImage) + 1);
% 显示幅度谱
figure;
imshow(amplitudeSpectrum, []);

可以得到彩色频率图和灰度频率图如下:

图1彩色频率图和灰度频率图

三、滤除不同频率分量得到不同效果

        首先使用高斯低通滤波器观察彩图和灰度图,然后滤去了不同频率分量观察彩图和灰度图,可以明显地看到,滤除低通会失去图像的背景、平坦区域以及大体结构等信息,滤除高通会失去图像的边缘、纹理和细微结构等信息。因此,使用双边滤波能够较好实现美颜。

1.高斯低通滤波器

close all;
clear all;
clc;
I = imread('罗中立 父亲.jpg');
% I=rgb2gray(I);//将图像转换成灰度图
I=im2double(I);
subplot(121),imshow(I);
title('原始图像');
 
s=fftshift(fft2(im2double(I)));
[a,b]=size(s);
a0=round(a/2);
b0=round(b/2);
d0=50; % 将滤波器的截止频率D0设置为50
d1=300;
for i=1:a %双重for循环计算频率点(i,j)与频域中心的距离D(i,j)=sqrt((i-round(a/2)^2+(j-round(b/2)^2))
    for j=1:b
        distance=sqrt((i-a0)^2+(j-b0)^2);
        if distance<=d0 || distance>=d1 % 根据理想带阻滤波器产生公式,置为1
            h=1;
        else
            h=0;        % 根据滤波器产生公式,当D1>D(i,j)>D0,置为0
        end
        s(i,j)=h*s(i,j);% 频域图像乘以滤波器的系数
    end
end
% real函数取元素的实部
s=real(ifft2(ifftshift(s)));% 最后进行二维傅里叶反变换转换为时域图像
subplot(122),imshow(s,[]);
title('理想带阻滤波所得图像');

图2高斯低通灰度图

图3高斯低通彩图

图4不同频段滤波滤波图像

        从上图分析结果中可以看到高斯滤波导致图像变得模糊了,原因是它在滤波过程中只关注了位置信息。因此我们引入双边滤波以获得更好滤波效果。

2.双边滤波器

        在双边滤波中,每个像素的滤波权重不仅取决于其与中心像素的空间距离(即位置关系),还取决于它们的像素值之间的差异。这意味着对于像素值相近的像素,它们会被赋予更大的权重,而对于像素值差异较大的像素,它们会被赋予较小的权重。

双边滤波中使用的算法:

空间域核函数:基于像素之间的空间距离来计算权重。

灰度域核函数:基于像素之间的灰度差异来计算权重。

权重计算:双边滤波器将空间域核函数和灰度域核函数的结果相乘,得到最终的权重。

clc;clear;close all;  
 
img0 = imread('罗中立 父亲.jpg');  

tempsize = 5; 
sigma1 = 3; 
sigma2 = 0.1; 
img = double(padarray(img0,[tempsize,tempsize],0))/255; 
%通道提取 
imgr = img(:,:,1); 
imgg = img(:,:,2); 
imgb = img(:,:,3);   

[m,n] = size(imgr); 
  
figure(1) 
subplot(1,2,1)
imshow(img0) 
title('原图')   

%通道处理1 
img(:,:,1) = B_filter(imgr,tempsize,sigma1,sigma2);   
img(:,:,2) = B_filter(imgg,tempsize,sigma1,sigma2);   
img(:,:,3) = B_filter(imgb,tempsize,sigma1,sigma2);   
subplot(1,2,2) 
imshow(img(tempsize+1:m-tempsize,tempsize+1:n-tempsize,:)) 
title('双边滤波处理后图像')  

function out = B_filter(Img,tempsize,sigma0,sigma1) 
%模板定义  
gauss = fspecial('gauss',2*tempsize+1,sigma0); 
  
[m,n] = size(Img);   

for i = 1+ tempsize : m - tempsize    
    for j = 1+ tempsize : n - tempsize        
        %提取处理区域得到梯度敏感矩阵        
        temp = abs(Img(i - tempsize:i + tempsize,j - tempsize:j + tempsize) - Img(i,j));                                                        
        temp = exp(-temp.^2/(2*sigma1^2));        
        %得到双边滤波器并将权值和化为一        
        filter = gauss.*temp;        
        filter = filter/sum(filter(:));       
         %卷积        
        Img(i,j) = sum(sum((Img(i - tempsize:i + tempsize,j - tempsize:j + tempsize).*filter)));     end 
    end   

out = Img; 
end

图5双边滤波前后图像

  • 17
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值