RGB图像对亮度和饱和度的表示不是很直观。而HSV空间图像却可以很直观的表现出每个像素的亮度和饱和度

所以先将RGB图像转换为HSV图像,然后调整亮度和饱和度,最后将HSV图像转换为RGB图像。

参考公式:http://en.wikipedia.org/wiki/HSL_color_space

activity的代码:

public void remove(View v){
Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.cc);
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int[] inpixel=new int[width*height];
int[] outpixel=new int[width*height];
bitmap.getPixels(inpixel, 0, width, 0, 0, width, height);
for(int y=0;y<height;y++){
for(int x=0;x<width;x++){
int a=inpixel[y*width+x]>>24&0xff;
int r=inpixel[y*width+x]>>16&0xff;
int g=inpixel[y*width+x]>>8&0xff;
int b=inpixel[y*width+x]&0xff;

//from RGB to HSL
float H=0,S=0,V=0;
float cMax=255.0f;
float high=Math.max(r, Math.max(g,b));
float low=Math.min(r, Math.min(g,b));
float rng=high-low;
//计算明度v
V=high/cMax ;
//计算饱和度S
if(high>0){
S=(float)rng/high;
}
//计算色调H

if(rng>0){
float rr=(float)(high-r)/rng;
float gg=(float)(high-g)/rng;
float bb=(float)(high-b)/rng;
float hh=0;
if(r==high){
hh=bb-gg;
}else if(g==high){
hh=rr-bb+2;
}else if(b==high){
hh=gg-rr+4;
}

if(hh<0){
H=(hh+6)/6;
}else{
H=hh/6;
}
}

//application HSL
H=H;
S=S+0.01f;
V=V+0.2f;
if(H>1){
H=1;
}
if(S>1){
S=1;
}
if(V>1){
V=1;
}
//form HSL to RGB
int pix=HSVtoRGB(H,S,V);
pix=a<<24|pix;
outpixel[y*width+x]=pix;
}
}
Bitmap newBitmap=Bitmap.createBitmap(width, height,Config.RGB_565);
newBitmap.setPixels(outpixel, 0, width, 0, 0, width, height);
destinationImage.setImageBitmap(newBitmap);
}

public int HSVtoRGB(float h,float s,float v){
float rr=0,gg=0,bb=0;
float hh=(6*h)%6;
int c1=(int)hh;
float c2=hh-c1;
float x=(1-s)*v;
float y=(1-s*c2)*v;
float z=(1-(s*(1-c2)))*v;
switch(c1){
case 0: rr=v;gg=z;bb=x;break;
case 1: rr=y;gg=v;bb=x;break;
case 2: rr=x;gg=v;bb=z;break;
case 3: rr=x;gg=y;bb=v;break;
case 4: rr=z;gg=x;bb=v;break;
case 5: rr=v;gg=x;bb=y;break;
}
int N=256;
int r=Math.min(Math.round(rr*N),N-1);
int g=Math.min(Math.round(gg*N),N-1);
int b=Math.min(Math.round(bb*N),N-1);
return r<<16|g<<8|b;
}

得到的效果是:

然后在网上看见一篇博客:http://blog.csdn.net/jia20003/article/details/8026552

是采用将RGB图转换为HSL图像改变亮度和饱和度的。大家可以参考下。

二、YUV(YCrCb) 1.Y表时明亮度,也就是灰度值;U(Cb)和V(Cr)描述了图像色彩及 饱和度 ,Cr反映了 RGB 输入信号红色部分与 RGB 信号亮度值之间的差异,Cb反映的是 RGB 输入信号蓝色部分与 RGB 信号亮度值之同的差异。 2. RGB 和YUV转换公式
首先 RGB 只是用于形成我们想要的颜色,比如说,我们想要黄色,可以通过三原色形成黄色,不管是明黄还是淡黄,只需要用不同比例进行混合就能得到我们想要的颜色,但是在我们进行编程的过程中不能直接用这个比例 ,需要辅助工具,也就是 HSV ,所以需要将 RGB 转化成 HSV HSV 用更加直观的数据描述我们需要的颜色,H代表色彩,S代表深浅,V代表明暗。 HSV 在进行色彩分割时作用比较大。通过阈值的划分,颜色能够被区分出来。
1. RGB HSV 各自存在的意义,以及为什么要相互转换 ref:https://blog.csdn.net/viewcode/article/details/8203728 RGB : 通过三原色的混合来产生不同的颜色效果,三原色分别由8bit定义,在硬件实现中便于理解和处理;(PS,其他颜色由三原色混合并不能说其他颜色就是混合光,比如黄光就是一种单色光,更合适的说法是“将三原色光以不同的...
主要是在YCrCb格式下完成,所以首先第一步就是需要将图像从 RGB 转换到YCrCb格式。 具体公式如下: Y = 0.299 * R + 0.587 * G + 0.114 * B Cr = 0.500 * R - 0.41
rgb 221,0,27 可以 转换成 hsv 的格式,具体的方法如下: 首先,我们需要将 rgb 转换成 浮点数,方法是将每个值除以 255。因此, rgb (221,0,27) 可以 转换成 (0.8666666666666667, 0.0, 0.10588235294117647)。 然后,我们可以使用以下公式来计算 hsv 值: h = 色相,s = 饱和度 ,v = 明度 maxc = max(r, g, b) minc = min(r, g, b) if maxc == minc: h = 0 elif maxc == r: h = 60 * ((g - b) / (maxc - minc)) elif maxc == g: h = 60 * (2 + (b - r) / (maxc - minc)) else: h = 60 * (4 + (r - g) / (maxc - minc)) if h < 0: h += 360 s = 0 if maxc == 0 else (1 - minc / maxc) v = maxc 所以, rgb (221,0,27) 可以 转换成 hsv (348.57142857142856, 1.0, 0.8666666666666667)。 注意:在计算 hsv 值时,色相 h 的单位是角度, 饱和度 s 和 明度 v 的单位都是百分比,它们的取值范围分别是 0 到 360、0 到 1 和 0 到 1。