您的位置:首页 > 编程语言

现有如下图所示人物图像,编程实现人物美肤(祛斑、磨皮)。

2018-01-14 19:15 363 查看
图片如下



实现人物的祛斑和磨皮,结合上课老师讲的内容,我打算用两种方式来实现,一种是高斯滤波,一种是双边滤波。通过实现这两种方式,最后总结比较这两种方式的不同

高斯滤波的代码
function g= gaussian(f)

%高斯滤波

%这段代码加了一个高斯滤波,最后用了一点小技巧,使得图像变白,达到美白得效果

    %gaussian

    figure,imshow(f,[]);  %显示原图

    h=fspecial('gaussian',[3 3],100);

    I1=imfilter(f,h,'same');

    figure,imshow(I1,[]);  %显示经过高斯滤波处理之后的图

    

    opacity = 0.5;

    G = (f*(1 - opacity)+(f+2*I1-1)*opacity);%blend

    figure,imshow(G,[]);  %显示经过blend处理之后的图

  

    G=G+30;  %增大RGB的值,因为越大的RGB值,越白

    figure,imshow(G,[]);  %显示经过美白处理之后的图

    

    g=G;

end

双边滤波的代码
function g=bilateral_filter(f)

%双边滤波器函数

%所谓的双边滤波,可以理解为就是两个不同的滤波模板点乘

    figure,imshow(f,[]);  %显示原图

    f=double(f)/255;     %进行归一化,归一化的目的是可以抗干扰,去噪,便于w2的计算

    f=applycform(f,makecform('srgb2lab'));  %用于颜色空间转换,我试过,如果不加这个代码,效果会差很多

    [m,n,c]=size(f);   

    r=5;

    fr=padarray(f,[r,r],'symmetric');

    sigma_s=input('input spatial similarity:'); % 2 4 8……,spatial similarity

    sigma_r=input('input range similarity:'); % 0.1 0.2 0.4……range similarity

    sigma_r=sigma_r*100;

    w1=fspecial('gaussian',[2*r+1,2*r+1],sigma_s);   %得到一个高斯模板,以距离作为自变量高斯滤波器

    h=waitbar(0,'wait……');  %显示进度条的函数

    for i=r+1:r+m          

        for j=r+1:r+n

            diffpix(:,:,1)=fr(i-r:i+r,j-r:j+r,1)-fr(i,j,1); % 计算像素差值,diffpix(:,:,1)表示RGB中的R

            diffpix(:,:,2)=fr(i-r:i+r,j-r:j+r,2)-fr(i,j,2);

            diffpix(:,
9557
:,3)=fr(i-r:i+r,j-r:j+r,3)-fr(i,j,3);

            %以周围和当前像素灰度差值作为自变量的高斯滤波器

            w2=exp(-(diffpix(:,:,1).^2+diffpix(:,:,2).^2+diffpix(:,:,3).^2)/(2*sigma_r.^2));

            w=w1.*w2;  %两个高斯模板点乘就得到了最终的双边滤波模板。

            fr(i,j,1)=sum(fr(i-r:i+r,j-r:j+r,1).*w)/sum(w);  %根据双边滤波器公式

            fr(i,j,2)=sum(fr(i-r:i+r,j-r:j+r,2).*w)/sum(w);

            fr(i,j,3)=sum(fr(i-r:i+r,j-r:j+r,3).*w)/sum(w);

        end

        waitbar(i/m);   

    end

    close(h);

    %重新赋值

    g(:,:,1)=fr(r+1:r+m,r+1:r+n,1);

    g(:,:,2)=fr(r+1:r+m,r+1:r+n,2);

    g(:,:,3)=fr(r+1:r+m,r+1:r+n,3);

    g=applycform(g,makecform('lab2srgb'));  %重新转换回来显示图像

    figure,imshow(g,[]);

end

总结

通过分别用高斯滤波和双边滤波进行编程对图片进行处理,在这一步部分,谈谈我对高斯滤波和双边滤波的理解。高斯滤波算法中,目标点上的像素值通常是由其所在位置上的周围的一个小局部邻居像素的值所决定。在2D高斯滤波中的具体实现就是对周围的一定范围内的像素值分别赋以不同的高斯权重值,并在加权平均后得到当前点的最终结果。一般的高斯模糊在进行采样时主要考虑了像素间的空间距离关系,但是却并没有考虑像素值之间的相似程度。而双边滤波,采样时不仅考虑像素在空间距离上的关系,同时加入了像素间的相似程度考虑,因而可以保持原始图像的大体分块进而保持边缘。双边滤波可以说是建立在高斯滤波的基础之上的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐