使用Matlab实现美颜功能(双边滤波器)

使用Matlab实现美颜功能(双边滤波器)

先晒美颜效果

借用一张lena小姐的图
题外话 lena小姐的全图真的 sex
在这里插入图片描述
可以看出美颜效果还是明显的,下面进行过程实现

基本原理

保留边界细节,模糊变化不明显的区域

我们知道高斯滤波器可以起到模糊图像的作用,而上述的过程是选择性地进行模糊,在这里是对图像的灰度变化进行一个判断,达到模糊该模糊的地方,并保留边缘的细节

这里可以推断,我们需要一个高斯滤波器和一个反映灰度判断的矩阵,来处理高斯滤波器各个位置的权重。

获取图片

img0 = imread('lena.jpg');

tempsize = 5; 	%控制高斯滤波器大小的参数

sigma1 = 3;   	%控制高斯滤波器的标准差

sigma2 = 0.04;	%控制灰度的敏感性,越大的灰度差,权重越小

%模板补零,便于卷积操作,不然会使得图片区域出现黑边
img = double(padarray(img0,[tempsize,tempsize],0))/255;

%色彩通道提取
imgr = img(:,:,1);
imgg = img(:,:,2);
imgb = img(:,:,3);

设计滤波器

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
       % 提取处理区域得到梯度敏感矩阵
       % Img(i - tempsize:i + tempsize,j - tempsize:j + tempsize)
       % 为卷积区域,Img(i,j))为卷积中心点
       
       % 得到灰度差值矩阵,并用高斯函数处理为灰度差越大则最终数值越小的权重矩阵
       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

使用滤波器依次处理三个色彩通道

最终显示

figure(1)
subplot(121)
imshow(img0)

subplot(122)
% 只显示彩色区域,去除黑边
imshow(img(tempsize+1:m-tempsize,tempsize+1:n-tempsize,:))

在这里插入图片描述
磨皮美颜用在lena小姐上效果还是不是太明显,换一张图

在这里插入图片描述
源码下载:
https://download.csdn.net/download/qq_45083791/12505841

猜你喜欢

转载自blog.csdn.net/qq_45083791/article/details/105523919