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);





相关文章
|
24天前
|
移动开发 算法 前端开发
前端常用算法全解:特征梳理、复杂度比较、分类解读与示例展示
前端常用算法全解:特征梳理、复杂度比较、分类解读与示例展示
20 0
|
3月前
|
机器学习/深度学习 人工智能 算法
【人工智能】传统语音识别算法概述,应用场景,项目实践及案例分析,附带代码示例
传统语音识别算法是将语音信号转化为文本形式的技术,它主要基于模式识别理论和数学统计学方法。以下是传统语音识别算法的基本概述
71 2
|
3月前
|
机器学习/深度学习 运维 算法
深入探索机器学习中的支持向量机(SVM)算法:原理、应用与Python代码示例全面解析
【8月更文挑战第6天】在机器学习领域,支持向量机(SVM)犹如璀璨明珠。它是一种强大的监督学习算法,在分类、回归及异常检测中表现出色。SVM通过在高维空间寻找最大间隔超平面来分隔不同类别的数据,提升模型泛化能力。为处理非线性问题,引入了核函数将数据映射到高维空间。SVM在文本分类、图像识别等多个领域有广泛应用,展现出高度灵活性和适应性。
145 2
|
4月前
|
并行计算 算法 Python
Dantzig-Wolfe分解算法解释与Python代码示例
Dantzig-Wolfe分解算法解释与Python代码示例
|
3月前
|
机器学习/深度学习 算法 Python
python与朴素贝叶斯算法(附示例和代码)
朴素贝叶斯算法以其高效性和优良的分类性能,成为文本处理领域一项受欢迎的方法。提供的代码示例证明了其在Python语言中的易用性和实用性。尽管算法假设了特征之间的独立性,但在实际应用中,它仍然能够提供强大的分类能力。通过调整参数和优化模型,你可以进一步提升朴素贝叶斯分类器的性能。
96 0
|
5月前
|
机器学习/深度学习 算法 数据挖掘
Python机器学习10大经典算法的讲解和示例
为了展示10个经典的机器学习算法的最简例子,我将为每个算法编写一个小的示例代码。这些算法将包括线性回归、逻辑回归、K-最近邻(KNN)、支持向量机(SVM)、决策树、随机森林、朴素贝叶斯、K-均值聚类、主成分分析(PCA)、和梯度提升(Gradient Boosting)。我将使用常见的机器学习库,如 scikit-learn,numpy 和 pandas 来实现这些算法。
|
5月前
|
存储 算法 Java
Java查找算法概览:二分查找适用于有序数组,通过比较中间元素缩小搜索范围;哈希查找利用哈希函数快速定位,示例中使用HashMap存储键值对,支持多值关联。
【6月更文挑战第21天】Java查找算法概览:二分查找适用于有序数组,通过比较中间元素缩小搜索范围;哈希查找利用哈希函数快速定位,示例中使用HashMap存储键值对,支持多值关联。简单哈希表实现未涵盖冲突解决和删除操作。
55 1
|
5月前
|
存储 算法 测试技术
数据结构学习记录——树习题-Complete Binary Search Tree(题目描述、输入输出示例、数据结构的选择、核心算法、计算左子树的规模)
数据结构学习记录——树习题-Complete Binary Search Tree(题目描述、输入输出示例、数据结构的选择、核心算法、计算左子树的规模)
77 1
|
6月前
|
算法 搜索推荐 Java
利用java编写的项目设备调配系统代码示例(内含5种设备调配的算法)
利用java编写的项目设备调配系统代码示例(内含5种设备调配的算法)
59 1
下一篇
无影云桌面