图象处理算法 一个图象处理的问题,有把图象上的颜色变的更深的算法吗?比如绿色更绿,黄色更黄,红色更红,总之是在正常的情况下让图片颜色更加鲜亮。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 把每个颜色分量都乘上一个系数不就可以了吗?比如,提取rgb颜色数值,各自乘上1.2,red = red * 1.2;if (red>255) red = 255;再复制回去 个人觉得应该先将RGB转换为HSL颜色空间。即色调、色饱和度和亮度三个分量,然后保持色调不变,提高色饱和度和亮度分量就可以了。这里提供一个转换函数://H色调//S饱和度//L亮度#define min(a,b) (((a)<(b))?(a):(b))#define max(a,b) (((a)>(b))?(a):(b))#define bmax 100.0 //Input HSL channel maximum#define cmax 255.0 //Output color maximum void HslToRgb(double h, double s, double L, double& r, double& g, double& b) { h *= cmax*6.0/bmax; s *= cmax/bmax; L *= cmax/bmax; r = min(cmax, max(0.0, fabs(3.0*cmax - fmod(h, 6.0*cmax)) - cmax)); g = min(cmax, max(0.0, fabs(3.0*cmax - fmod(h + 4.0*cmax, 6.0*cmax)) - cmax)); b = min(cmax, max(0.0, fabs(3.0*cmax - fmod(h + 2.0*cmax, 6.0*cmax)) - cmax)); if (L > cmax/2) { r = (L*2/cmax-1)*(cmax-r) + r; g = (L*2/cmax-1)*(cmax-g) + g; b = (L*2/cmax-1)*(cmax-b) + b; } else { r *= L*2/cmax; g *= L*2/cmax; b *= L*2/cmax; } double ave = (r + g + b)/3.0; r = (1.0-s/cmax)*(ave - r) + r; g = (1.0-s/cmax)*(ave - g) + g; b = (1.0-s/cmax)*(ave - b) + b; } 同意 ddmor ,其他人说的就是调节亮度,亮度并不能使图象鲜亮 如果单纯在RGB上乘一个系数是不对的,比如(255,240,240)和(255,220,220)乘上1.2后都成了(255,255,255),这是不合理的 ddmor说的有道理,转换成HSL颜色空间再处理 http://www.easyrgb.com/math.php?MATH=M18这个是一个关于各种颜色空间相互转换公式的网站对于楼主的这个问题,转换颜色空间的代价比较高,而且效果上也相差不了多少所以直接乘一个系数是最简单的办法 网线有8根,4根用来收发,其中2收2发,请问发送一个字节,怎么在这两个线上发? 基于odbc的数据库访问 vc6,可以编译,链接,但是无法直接运行,就是无法调试,怎么 解决呢? 在属性页上如何使用CToolTipCtrl? 求助, 大家看看这个代冒号的struct的长度, 为什么? vc里面怎么画箭头 请问GetDiskFreeSpaceEx函数的具体用法如何? 在Win2000,IIS5.0,VC.NET 环境下编译的ISAPI的DLL如何调试? visual c#是深末? 从磁盘读取资源文件的问题 怎么用代码修改刷新网络属性?急 谁有c++实现的邻接多重表的详细代码?
比如,提取rgb颜色数值,各自乘上1.2,
red = red * 1.2;
if (red>255) red = 255;再复制回去
这里提供一个转换函数:
//H色调
//S饱和度
//L亮度
#define min(a,b) (((a)<(b))?(a):(b))#define max(a,b) (((a)>(b))?(a):(b))#define bmax 100.0 //Input HSL channel maximum#define cmax 255.0 //Output color maximum void HslToRgb(double h, double s, double L, double& r, double& g, double& b) { h *= cmax*6.0/bmax; s *= cmax/bmax; L *= cmax/bmax; r = min(cmax, max(0.0, fabs(3.0*cmax - fmod(h, 6.0*cmax)) - cmax)); g = min(cmax, max(0.0, fabs(3.0*cmax - fmod(h + 4.0*cmax, 6.0*cmax)) - cmax)); b = min(cmax, max(0.0, fabs(3.0*cmax - fmod(h + 2.0*cmax, 6.0*cmax)) - cmax)); if (L > cmax/2) { r = (L*2/cmax-1)*(cmax-r) + r; g = (L*2/cmax-1)*(cmax-g) + g; b = (L*2/cmax-1)*(cmax-b) + b; } else { r *= L*2/cmax; g *= L*2/cmax; b *= L*2/cmax; } double ave = (r + g + b)/3.0; r = (1.0-s/cmax)*(ave - r) + r; g = (1.0-s/cmax)*(ave - g) + g; b = (1.0-s/cmax)*(ave - b) + b; }
这个是一个关于各种颜色空间相互转换公式的网站对于楼主的这个问题,转换颜色空间的代价比较高,而且效果上也相差不了多少
所以直接乘一个系数是最简单的办法