人脸美妆之饱和度调节

本次分享PS饱和度调节算法代码,具体实现如下:

float max_value(float a, float b, float c) 
{
	if (a > b && a > c) return a;
	if (b > a && b > c) return b;
	return c;
}

float min_value(float a, float b, float c)
{
	if (a < b && a < c) return a;
	if (b < a && b < c) return b;
	return c;
}


void adjust_saturation(cv::Mat&src,cv::Mat&dst,float value) 
{
	src.copyTo(dst);

	float ratio = value / 100.0;

	for (int i = 0; i < src.cols;i++) 
	{
		for (int j=0;j<src.rows;j++) 
		{
			float cur_r = 0.0;
			float cur_g = 0.0;
			float cur_b = 0.0;

			cv::Scalar cur_scalar = src.at<cv::Vec3b>(j, i);
			cur_r = cur_scalar[0];
			cur_g = cur_scalar[1];
			cur_b = cur_scalar[2];

			float rgb_min = min_value(cur_r, cur_g, cur_b);
			float rgb_max = max_value(cur_r, cur_g, cur_b);

			float delta_value = (rgb_max - rgb_min) / 255;
			if (fabs(delta_value) < 0.01)
				continue;

			float base_value = (rgb_max + rgb_min) / 255;
			float half_base_value = base_value / 2.0;

			float s_value = (half_base_value < 0.5 ? (delta_value / base_value) : delta_value / (2.0 - base_value));
			float alpha = 0.0;

			if (ratio >= 0)
			{
				alpha = ratio + s_value >= 1 ? s_value : 1 - ratio;
				alpha = 1 / alpha - 1;
			}
			else
				alpha = s_value;

			cur_r = cur_r + (cur_r - half_base_value * 255)*alpha;
			cur_g = cur_g + (cur_g - half_base_value * 255)*alpha;
			cur_b = cur_b + (cur_b - half_base_value * 255)*alpha;

			dst.at<cv::Vec3b>(j, i)[0] = cur_r;
			dst.at<cv::Vec3b>(j, i)[1] = cur_g;
			dst.at<cv::Vec3b>(j, i)[2] = cur_b;
		}
	}





	return;
}

void on_saturation(int value, void*param)
{
	cv::Mat src = *(cv::Mat*)param;
	cv::Mat dst;
	adjust_saturation(src, dst, value);
	cv::imshow("TrackBar", dst);
	return;
}

int adjust_saturation() 
{
	cv::Mat img = cv::imread("3.jpg");
	cv::Mat dst;

	cv::namedWindow("TrackBar", CV_WINDOW_AUTOSIZE);

	int value = 50;

	//adjust_saturation(img, dst, value);

	cv::createTrackbar("Threshold", "TrackBar", &value, 100, on_saturation, &img);
	//cv::imshow("TrackBar", dst);
	cv::waitKey(0);


	return 0;
}

在这里插入图片描述在这里插入图片描述在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值