使用OPENCV简单实现具有肤质保留功能的磨皮增白算法

在一个美颜高手那里发现一个美颜算法,他写出了数学表达式,没有给出代码,正好在研究OPENCV,顺手实现之。具体过程就是一系列矩阵运算,据说是从一个PS高手那里研究 出来的,一并表示感谢。

这是数学表达式:

Dest =(Src * (100 - Opacity) + (Src + 2 * GuassBlur(EPFFilter(Src) - Src + 128) - 256) * Opacity) /100 ;

	public static Mat face2(Mat image) {
		Mat dst = new Mat();

		// int value1 = 3, value2 = 1; 磨皮程度与细节程度的确定
		int value1 = 3, value2 = 1; 
		int dx = value1 * 5; // 双边滤波参数之一
		double fc = value1 * 12.5; // 双边滤波参数之一
		double p = 0.1f; // 透明度
		Mat temp1 = new Mat(), temp2 = new Mat(), temp3 = new Mat(), temp4 = new Mat();

		// 双边滤波
		Imgproc.bilateralFilter(image, temp1, dx, fc, fc);

		// temp2 = (temp1 - image + 128);
		Mat temp22 = new Mat();
		Core.subtract(temp1, image, temp22);
		// Core.subtract(temp22, new Scalar(128), temp2);
		Core.add(temp22, new Scalar(128, 128, 128, 128), temp2);
		// 高斯模糊
		Imgproc.GaussianBlur(temp2, temp3, new Size(2 * value2 - 1, 2 * value2 - 1), 0, 0);

		// temp4 = image + 2 * temp3 - 255;
		Mat temp44 = new Mat();
		temp3.convertTo(temp44, temp3.type(), 2, -255);
		Core.add(image, temp44, temp4);
		// dst = (image*(100 - p) + temp4*p) / 100;
		Core.addWeighted(image, p, temp4, 1 - p, 0.0, dst);
		
		Core.add(dst, new Scalar(10, 10, 10), dst);
		return dst;

	}
	      

测试代码:

 Mat src2 = Imgcodecs.imread("E:/work/qqq/e.jpg");
         Mat src3 = face2(src2);
       
         Mat dest = new Mat(new Size(src2.cols()+src3.cols(), src2.rows()), src2.type());
         Mat temp1 = dest.colRange(0, src2.cols());
         Mat temp2 = dest.colRange(src2.cols(), dest.cols());
         src2.copyTo(temp1);
         src3.copyTo(temp2);
	Imgcodecs.imwrite("E:/work/qqq/z3.jpg",dest);	


参考:

http://www.cnblogs.com/Imageshop/p/4709710.html

http://www.cnblogs.com/Imageshop/p/3871237.html

敬告:该系列的课程在抓紧录制更新中,敬请大家关注。敬告: 该系列的课程涉及:FFmpeg,WebRTC,SRS,Nginx,Darwin,Live555,OpenCV,等。包括:音视频、流媒体、直播、Android、视频监控28181、等。 我将带领大家一起来学习OpenCV4的图像处理原理和编程知识,并动手操练58案例代码。具体内容包括: 一、小白入门与初体验:禁果尝鲜二、图像基本操作:懵懵懂懂学图像三、图像统计操作:七七八八有收获四、图像卷积:不入虎穴焉得虎子五、磨皮美颜:柳暗花明又一村六、二值图像:阴阳合一法自然七、图像形态学:登高望远天地阔 音视频与流媒体是一门很复杂的技术,涉及的概念、原理、理论非常多,很多初学者不学 基础理论,而是直接做项目,往往会看到c/c++的代码时一头雾水,不知道代码到底是什么意思,这是为什么呢? 因为没有学习音视频和流媒体的基础理论,就比如学习英语,不学习基本单词,而是天天听英语新闻,总也听不懂。所以呢,一定要认真学习基础理论,然后再学习播放器、转码器、非编、流媒体直播、视频监控、等等。 梅老师从事音视频与流媒体行业18年;曾在永新视博、中科大洋、百度、美国Harris广播事业部等公司就职,经验丰富;曾亲手主导广电直播全套项目,精通h.264/h.265/aac,曾亲自参与百度app上的网页播放器等实战产品。目前全身心自主创业,主要聚焦音视频+流媒体行业,精通音视频加密、流媒体在线转码快编等热门产品。     
为了实现一个具有基本磨皮效果的美颜相机功能,你可以利用Camera2 API来控制相机硬件,以及OpenCV库来处理图像数据。在你的学习过程中,可以参考《华南农业大学Android美颜相机APP毕设源码与文档》这份资料,它将帮助你理解项目实现的全流程。 参考资源链接:[华南农业大学Android美颜相机APP毕设源码与文档](https://wenku.csdn.net/doc/78quxj9p31) 首先,你需要对Camera2 API有足够的了解,这是Android提供的用于高级相机功能的API。通过它,你可以访问和控制相机的高级功能,如曝光、对焦、白平衡等。在这个过程中,你将学会如何构建一个预览界面,以及如何设置相机的输出格式以支持图像处理。 接着,涉及到图像处理,你应该熟悉OpenCV库在Android中的使用OpenCV是一个开源的计算机视觉和机器学习软件库,它包含了许多图像处理相关的功能。为了实现磨皮效果,你可以使用OpenCV中的滤波器功能,例如使用高斯模糊或者双边滤波器来平滑图像,达到磨皮效果。 在实现过程中,你可能需要了解如何将Camera2捕获的帧数据传递到OpenCV处理管道中,并将处理后的图像数据输出到用户界面上。此外,还需要处理实时性能问题,确保美颜效果可以实时应用于视频预览和拍照后的图像。 整个过程中,你将深入了解Android应用的生命周期、图像处理算法的原理和实现方法,以及用户界面的交互设计。这些技术点将有助于你构建一个高效且用户友好的美颜相机应用。 为了进一步学习和实践,建议在《华南农业大学Android美颜相机APP毕设源码与文档》的基础上,结合官方文档和在线资源,不断实践和优化你的项目。这份资料不仅提供了详实的项目实践,还有完整的文档说明,能够帮助你掌握相关的技术细节和设计思路。 参考资源链接:[华南农业大学Android美颜相机APP毕设源码与文档](https://wenku.csdn.net/doc/78quxj9p31)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值