现有如下图所示人物图像,编程实现人物美肤(祛斑、磨皮)。
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高斯滤波中的具体实现就是对周围的一定范围内的像素值分别赋以不同的高斯权重值,并在加权平均后得到当前点的最终结果。一般的高斯模糊在进行采样时主要考虑了像素间的空间距离关系,但是却并没有考虑像素值之间的相似程度。而双边滤波,采样时不仅考虑像素在空间距离上的关系,同时加入了像素间的相似程度考虑,因而可以保持原始图像的大体分块进而保持边缘。双边滤波可以说是建立在高斯滤波的基础之上的。
实现人物的祛斑和磨皮,结合上课老师讲的内容,我打算用两种方式来实现,一种是高斯滤波,一种是双边滤波。通过实现这两种方式,最后总结比较这两种方式的不同
高斯滤波的代码
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高斯滤波中的具体实现就是对周围的一定范围内的像素值分别赋以不同的高斯权重值,并在加权平均后得到当前点的最终结果。一般的高斯模糊在进行采样时主要考虑了像素间的空间距离关系,但是却并没有考虑像素值之间的相似程度。而双边滤波,采样时不仅考虑像素在空间距离上的关系,同时加入了像素间的相似程度考虑,因而可以保持原始图像的大体分块进而保持边缘。双边滤波可以说是建立在高斯滤波的基础之上的。
相关文章推荐
- 现有如下图所示人物图像,编程实现频率域滤波去噪。
- (C语言打印图形题4)编程,输入n,输出如下例(n=4)所示的高为n的倒立等腰三角形。
- 图像滤镜艺术---保留细节的磨皮之C#程序实现
- 【数字图像处理】Canny边缘检测详解及编程实现
- 在dos下实现图形图像编程(非Graphics.h)和其他第三方库
- 区域生长法的编程实现——程序员数字图像处理第一步
- VC编程使用3种方案实现位图图像灰度化
- 高斯图像滤波原理及其编程离散化实现方法
- C++读取、旋转和保存bmp图像文件编程实现
- iOS 6编程-UIScrollView滚动视图结合UIImageView图像视图实现图像缩放效果
- (C语言打印图形题5)编程,输入n,输出如下例(n=4)所示的高和上底均为n的等腰梯形。
- VC编程实现位图图像二值化、反相
- OpenCV编程案例:实现一个双目摄像头图像显示的程序
- EasyX-加载图像实现人物行走
- 数字图像处理-编程实现染色体计数 C语言实现
- 高斯图像滤波原理及其编程离散化实现方法
- linux提供了select、poll、epoll接口来实现IO复用,三者的原型如下所示,本文从参数、实现、性能等方面对三者进行对比。
- (C语言打印图形题3)编程,输入n,输出如下例(n=6)所示的高为n的等腰三角形。
- [C#编程参考]把图像转换为数组的两种实现
- Windows 中不规则窗体的编程实现三种方法:CRgn,作图路径法,据图像创建region