本次分享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;
}