• 一种具有肤质保留功能的磨皮算法


    基本原理

    1、复制原图Src作为HighPass层:HighPass = Copy(Src)。
    2、对HighPass层磨皮(就是进行保边滤波,可以选择表面模糊、导向滤波、双边滤波、各向异性扩散、BEEP、局部均方差、Domain transfer、 Adaptive Manifolds、 Local Laplacian Filters等任何具有保边效果的EPF-Filter):HighPass = EPF-Filter(HighPass)。
    3、得到高频信息:HihgPass = HighPass - Src + 128。
    4、对高频信息进行平滑:HighPass = GuassBlur(HighPass, Radius); 其中Radius为高斯模糊的半径。
    5、进行图层混合,利用线性光混合:Dest =(Src * (100 - Opacity) + (Src + 2 * GuassBlur(EPFFilter(Src) - Src + 128) - 256) * Opacity) /100 ;

    补充说明下线性光混合的计算公式。假定两个相邻图层X和Y,X在下方,Y在上方,X与Y混合,则X是基色,Y是混合色,X与Y混合得到的颜色是结果色Z,对于线性光混合模式,其计算公式为:
    Z = X + 2 * Y - 256;    (原先以为是 - 255,后用PS CS6验证是 - 256)
    不透明度的计算公式就更为简单,如果Opacity表示Y的不透明度,则合成公式为:
    Z = (X * (100- Opacity) + Y * Opacity ) / 100;
    那么两个综合在一起的计算公式为:
    Z = (X * (100- Opacity) + (X + 2 * Y - 256)* Opacity ) / 100;
    其中关键的恢复皮肤质感的步骤是第四步的高斯模糊,这个模糊的半径一般越大,质感越强,但是太大,磨皮效果就没有了,因此,这里需要把握合适的度,一般半径在0.5-2之间比较合适。

    示例演示

    #include
    #include 
    using namespace cv;
    
    int main(int argc, char *argv[])
    {
    	Mat image = cv::imread("1.jpg", 1);
    	std::vector<cv::Mat> images;
    	split(image, images);
    	for (int i = 0; i < image.channels(); i++)
    	{
    		Mat& img = images[i];
    		img.convertTo(img, CV_32F, 1, 0);
    		cv::Mat  highPass;
    		img.convertTo(highPass, CV_32F, 1, 0);
    
    		cv::Mat EPFFilter;
    		cv::bilateralFilter(highPass, EPFFilter, 15, 30, 60);
    	    //cv:imwrite("bilateralFilter.jpg", EPFFilter);
    		EPFFilter = EPFFilter - img;
    		EPFFilter = EPFFilter + 128.0;
    		//cv::imwrite("GaussianBlur0.jpg", EPFFilter);
    		cv::GaussianBlur(EPFFilter, highPass, cv::Size(5, 5), 0, 0);
    		//cv::imwrite("GaussianBlur.jpg", highPass);
    		double opacity = 90.0;
    		cv::Mat  dst = (img * (100.0 - opacity) + (img + 2.0 * highPass - 256.0) * opacity) / 100.0;
    		//cv::imwrite("dst.jpg", dst);
    		images[i] = dst;
    	}
    
    	Mat dst;
    	merge(images, dst);
    
    	cv::imwrite("dst.jpg", dst);
    
    	waitKey(0);
    	return EXIT_SUCCESS;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    在这里插入图片描述

    磨皮后
    在这里插入图片描述

  • 相关阅读:
    orcale 单表查询和多表联合查询
    【一起来学C++】————(8)模板
    【宋红康 MySQL数据库 】【高级篇】【19】多版本并发控制MVCC
    VMware虚拟机 Centos7 配置静态IP和DNS
    LeetCode 2007. 从双倍数组中还原原数组
    一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
    YOLOv5添加注意力机制
    policy gradient详解(附代码)
    怎样减少报表开发中的存储过程
    PMP每日十题-2024年2月29日
  • 原文地址:https://blog.csdn.net/webzhuce/article/details/127988464