对比度 饱和度 调节 问题请教

郑翼 发布于 2013/08/06 16:12
阅读 174
收藏 0

@恩赐解脱 你好,想跟你请教个问题:

你好 我看到你以前问过一个关于对比度 和 饱和度调节的算法 ,我现在也在研究这方面的问题。请问能告诉我一些方法么? 谢谢

加载中
0
徐迎龙
徐迎龙
如果有人回答,我也想了解一下
0
TinkerS
TinkerS

网上有很多讲这个转化原理的呀,贴一小段代码你参考参考

void brightness_contrast_ajust(RGB *rgb, int contrast, int brightness) {

// 对比度阈值
int threshold = 128;


// 计算对比度数组
double cv = (contrast <= -255) ? -1.0f : contrast / 255.0f;
if (contrast > 0 && contrast < 255) {
cv = 1.0f / (1.0f - cv) - 1.0f;
}


int r = rgb->r;
int g = rgb->g;
int b = rgb->b;


r = (contrast > 0) ? CLAMP(r + brightness) : r;
g = (contrast > 0) ? CLAMP(g + brightness) : g;
b = (contrast > 0) ? CLAMP(b + brightness) : b;


if (contrast >= 255) {
r = (r > threshold) ? 255 : 0;
g = (g > threshold) ? 255 : 0;
b = (b > threshold) ? 255 : 0;
} else {
r = CLAMP(r + (int) ((r - threshold) * cv + 0.5f));
g = CLAMP(g + (int) ((g - threshold) * cv + 0.5f));
b = CLAMP(b + (int) ((b - threshold) * cv + 0.5f));
}


r = (contrast < 0) ? CLAMP(r + brightness) : r;
g = (contrast < 0) ? CLAMP(g + brightness) : g;
b = (contrast < 0) ? CLAMP(b + brightness) : b;


rgb->r = CLAMP(r);
rgb->g = CLAMP(g);
rgb->b = CLAMP(b);
}


void saturation_ajust(RGB *rgb, int saturation) {
int r = rgb->r;
int g = rgb->g;
int b = rgb->b;


double l;
double factor = saturation / 100.0;


// 调整饱和度
int rgb_max = MAX(MAX(r, g), b);
int rgb_min = MIN(MIN(r, g), b);


l = (rgb_max + rgb_min) / (2 * 255.0f);


r = (int) (r + (r - l * 255.0) * factor);
g = (int) (g + (g - l * 255.0) * factor);
b = (int) (b + (b - l * 255.0) * factor);


rgb->r = CLAMP(r);
rgb->g = CLAMP(g);
rgb->b = CLAMP(b);
}
TinkerS
TinkerS
回复 @郑翼 : 色调的话原理我不太清楚,不过我有看到可以用卷积来做,就是设一种色调的矩阵参数,然后将待处理的图和参数矩阵做个卷积运算,至于参数怎么调我也不是很懂了,像一些效果比方说sepia tone的色调矩阵网上应该挺容易查到,你可以研究一下
郑翼
哦,懂了,谢谢你; CLAMP (X)是 clamp(0,255,x)的宏吧 还有 我想问问 如果是想改变色调呢 就是让图像整体偏向一个色调。。 有什么好方法么?
返回顶部
顶部