使用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