WLS算法的一个示例——实现美颜磨皮

简介: WLS算法的一个示例——实现美颜磨皮

前言


  这里我分享一下加权最小二乘法滤波算法对图像进行滤波处理实现磨皮功能;借助wlsFilter函数在MATLAB中实现该功能




实现思路及函数说明


  给定一个输入图像命名INPUT,我们需要得到一张图像命名为OUTPUT,这张图像一方面,它尽可能接近INPUT,同时,除了INPUT中的显着梯度之外,它在任何地方都尽可能平滑。


wlsFilter函数说明


参数 说明
INPUT 输入图像(二维、双精度、N×M 矩阵)
lambda 数据项和平滑项之间的平衡。 增加 lambda 将产生更平滑的图像。默认值为 1.0
alpha 通过对梯度进行非线性缩放,对亲和力进行一定程度的控制。 增加 alpha 将导致更锐利的保留边缘。 默认值:1.2
L 与源图像相似。 它具备与输入图像INPUT相同的尺寸

使用wlsFilter实现磨皮流程:


  1. 读取RGB图像(自己的人脸);


  1. 将RGB图像转化为灰度图YCBR;


  1. YCBR图像数据格式由unit8型转变为double型;


  1. 获取YCBR矩阵的第三个通道的值记为YCBR_B;


  1. 计算YCBR_B图像中的最大值(由于计算出来的是一个数组,这里可以求该数组的最值OR均值),记为:MAX_YCBR_B;


  1. 合理设置wlsFilter参数并计算出结果转uint8型数据便于显示(构造方式:YCBR_B,lambda,alpha,YCBR_B./MAX_YCBR_B);


  1. 此时将第六步中数据转化为RGB进行显示(之前它为ycbr格式的图像)记为WLS_I。





结果展示


  左侧为原图(RGB图)、左侧为磨皮后的图像(WLS_I图)image.png


从结果上来看咱们磨皮的目的达到了,但是不够那么自然,像一个PS新手一般进行磨皮,针对此现象我们可以对此进行改进。


改进磨皮效果


  最终的效果目的为:成果 + 显的自然


实现流程:


8. 将磨皮后的图像(WLS_I)转换为double型


9. (磨皮后的图像 + 原图 )./(YCBR_B图像中的最大值)  = (WLS_I + RGB)./(MAX_YCBR_B)


10 输出改进后的图


改进后图像:


image.png


demo部分


定义函数wlsFilter

function OUTPUT = wlsFilter(INPUT, lambda, alpha, L)
if(~exist('L', 'var')),
    L = log(IN+eps);
end
if(~exist('alpha', 'var')),
    alpha = 1.2;
end
if(~exist('lambda', 'var')),
    lambda = 1;
end
smallNum = 0.0001;
[r,c] = size(IN);
k = r*c;
% Compute affinities between adjacent pixels based on gradients of L
dy = diff(L, 1, 1);
dy = -lambda./(abs(dy).^alpha + smallNum);
dy = padarray(dy, [1 0], 'post');
dy = dy(:);
dx = diff(L, 1, 2); 
dx = -lambda./(abs(dx).^alpha + smallNum);
dx = padarray(dx, [0 1], 'post');
dx = dx(:);
% Construct a five-point spatially inhomogeneous Laplacian matrix
B(:,1) = dx;
B(:,2) = dy;
d = [-r,-1];
A = spdiags(B,d,k,k);
e = dx;
w = padarray(dx, r, 'pre'); w = w(1:end-r);
s = dy;
n = padarray(dy, 1, 'pre'); n = n(1:end-1);
D = 1-(e+w+s+n);
A = A + A' + spdiags(D, 0, k, k);
% Solve
OUT = A\IN(:);
OUT = reshape(OUT, r, c);


主程序调用:

RGB = imread('test.jpg'); 
YCBRC = rgb2ycbcr(RGB);
I = double(YCBRC);
YCBR_B = I(:,:,1);
MAX_YCBR_B = max(max(YCBR_B))
lambda=0.001;
alpha=20;
OutPut_YCBRC = uint8(wlsFilter(YCBR_B, lambda,alpha,YCBR_B/MAX_YCBR_B));
OutPut_RGB=ycbcr2rgb(cat(3,diff,YCBRC (:,:,2:3)));
subplot(1,2,1)
imshow(RGB);
subplot(1,2,2)
imshow(OutPut_RGB);
C_OutPut = uint8((double(OutPut_RGB)+double(RGB))/2);
subplot(1,2,3)
imshow(C_OutPut);





相关文章
|
4天前
|
存储 算法 Java
Java查找算法概览:二分查找适用于有序数组,通过比较中间元素缩小搜索范围;哈希查找利用哈希函数快速定位,示例中使用HashMap存储键值对,支持多值关联。
【6月更文挑战第21天】Java查找算法概览:二分查找适用于有序数组,通过比较中间元素缩小搜索范围;哈希查找利用哈希函数快速定位,示例中使用HashMap存储键值对,支持多值关联。简单哈希表实现未涵盖冲突解决和删除操作。
12 1
|
18天前
|
存储 算法 测试技术
数据结构学习记录——树习题-Complete Binary Search Tree(题目描述、输入输出示例、数据结构的选择、核心算法、计算左子树的规模)
数据结构学习记录——树习题-Complete Binary Search Tree(题目描述、输入输出示例、数据结构的选择、核心算法、计算左子树的规模)
19 1
|
1月前
|
算法
R语言贝叶斯推断与MCMC:实现Metropolis-Hastings 采样算法示例
R语言贝叶斯推断与MCMC:实现Metropolis-Hastings 采样算法示例
|
1月前
|
算法 搜索推荐 Java
利用java编写的项目设备调配系统代码示例(内含5种设备调配的算法)
利用java编写的项目设备调配系统代码示例(内含5种设备调配的算法)
32 1
|
1月前
|
算法 搜索推荐 数据挖掘
时间复杂度、空间复杂度、算法的稳定性说明以及示例
时间复杂度、空间复杂度、算法的稳定性说明以及示例
30 0
|
算法 调度
迪杰斯特拉算法(Dijkstra's algorithm)以及示例
迪杰斯特拉算法(Dijkstra's algorithm)是一种非常重要且有价值的算法。它被广泛应用于计算图中单源最短路径问题,在交通路线规划、网络路由、作业调度等领域有着广泛的应用。迪杰斯特拉算法的最大优点是其简单易懂和时间复杂度较低,因此在实际应用中非常实用。它可以在稠密图和稀疏图中使用,对于边权均为非负数的图都可以使用。
迪杰斯特拉算法(Dijkstra's algorithm)以及示例
|
1月前
|
机器学习/深度学习 算法 TensorFlow
【Python机器学习】神经网络中误差反向传播(BP)算法详解及代码示例(图文解释 附源码)
【Python机器学习】神经网络中误差反向传播(BP)算法详解及代码示例(图文解释 附源码)
67 0
|
7月前
|
监控 算法 Java
局域网监控软件调度算法Java和Python的简单示例
提供了两个Java与Python的示例,包括设备类、监控软件类、添加设备、监控设备和调度监控任务的方法。监控设备的操作可以根据实际需求进行扩展。
436 0
|
11月前
|
算法 数据挖掘 Python
转:模拟退火算法在企业文档管理系统中的代码示例
企业文档管理系统是企业信息化建设的重要组成部分,它可以帮助企业更好地管理和利用各种文档信息。在企业文档管理系统中,模拟退火算法可以应用于优化文档检索和分类等方面。
49 0
转:模拟退火算法在企业文档管理系统中的代码示例
|
12月前
|
存储 算法
转:启发式算法以及示例
启发式算法(Heuristic Algorithm)是一种在解决问题时通过启发式规则来选择下一步操作的算法。它通常用于解决NP-hard问题,这些问题的精确算法在复杂度上是不可行的。
91 1

热门文章

最新文章