1. 程式人生 > >OpenCV(三)——PhotoShop中的飽和度調節

OpenCV(三)——PhotoShop中的飽和度調節

PhotoShop的飽和度調節公式:

 ①計算每個畫素點三基色最小值和最大值

②delta為兩值之差 / 255,如果兩值之差為0則不做操作

value為兩值之和 / 255

③有RGB影象空間轉化成HSL(H色調,S飽和度,L亮度)

L = value / 2

如果L < 0.5 則 S = delta / value;

否則   S = delta / (2 - value);

④Increment / 100 為飽和度

正值為提升飽和度,負值為降低飽和度。

根據不同公式得到新的rgb值。

 

#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;

#define max2(a, b) ( (a) > (b) ) ?  (a) : (b)
#define max3(a,b,c) ( ( (a) > (b) ) ?  max2( a, c) : max2( b, c ) )

#define min2(a, b)  ( (a) < (b) ) ?  (a) : (b)
#define min3(a,b,c) ( ( (a) < (b) ) ?  min2( a, c ) : min2( b, c ) )

const int max_Increment = 200;
int Increment_value;
Mat image;
Mat src;

void on_Trackbar(int , void*)
{
	float Increment= (Increment_value - 100)* 1.0/max_Increment;
	image = src.clone();
	for(int i = 0; i < image.cols; ++i)
	{
		for(int j = 0; j < image.rows; ++j)
		{
			uchar b = image.at<Vec3b>(j, i).val[0];
			uchar g = image.at<Vec3b>(j, i).val[1];
			uchar r = image.at<Vec3b>(j, i).val[2];
			float max = max3(r,g,b);
			float min = min3(r,g,b);
			float delta, value;
			uchar R_new, G_new, B_new;
			float L, S, alpha;
			delta = (max - min) / 255;
			if(delta == 0)
				continue;
			value = (max + min) / 255;
			L = value / 2;
			if(L < 0.5)
				S = delta / value;
			else
				S = delta / (2 - value);
			if(Increment >= 0)
			{
				if((Increment + S) >= 1)
					alpha = S;
				else
					alpha = 1 - Increment;
				alpha = 1 / alpha - 1;
				R_new = r + (r - L * 255) * alpha;

				G_new = g + (g - L * 255) * alpha;

				B_new = b + (b - L * 255) * alpha;
			}
			else
			{
				alpha = Increment;
				R_new = L * 255 + (r - L * 255) * (1+alpha);

				G_new = L * 255 + (g - L * 255) * (1+alpha);

				B_new = L * 255 + (b - L * 255) * (1+alpha);
			}
			image.at<Vec3b>(j, i).val[0] = B_new;
			image.at<Vec3b>(j, i).val[1] = G_new;
			image.at<Vec3b>(j, i).val[2] = R_new;
		}
	}
	imshow("image",image);
}
void main()
{
	image = imread("lena.png");
	src = image.clone();

	Increment_value = 100;

	namedWindow("image", 1);
	createTrackbar("飽和度", "image", &Increment_value, 200, on_Trackbar);

	on_Trackbar(Increment_value, 0);
	

	waitKey();
	image.release();
	src.release();

}