java BufferedImage rgb2hsv

来源:互联网 发布:怎么看链接是淘宝客 编辑:程序博客网 时间:2024/05/01 16:20

做了个java版的rgb2hsv

/* * RGB转HSV * 输入范围R,G,B, 0~255 * 输出范围[0]:0~1,[1]:0~1,[2]:0~255 */public static float[] rgb2hsvF(int R, int G, int B){ int tMax, tMin;float H=0,S=0,V=0;float delta;float tRet[] = new float[3];tMax=Math.max(R, Math.max(G,B));tMin=Math.min(R, Math.min(G,B));if(0 == tMax){tRet[0] = 0; tRet[1] = 0;tRet[2] = 0; return tRet;}V = tMax; delta = tMax - tMin; S = delta / tMax;     if(0 == delta){H = 0;}else if(G == tMax ){H = 2 + (B - R)  / delta; // between cyan & yellow}else if(B == tMax){H = 4 + (R - G)  / delta; // between magenta & cyan}else if(R == tMax){H =  (G - B) / delta;     // between yellow & magenta}  H *= 60; if(H < 0 ){H += 360;}tRet[0] = H/360.0f; tRet[1] = S;tRet[2] = V; return tRet;}/* * RGB转HSV图像 * 注意:HSV的范围都是0~255,H的范围不是0~360,否则显示的就不正常 */public static BufferedImage rgb2hsv(final BufferedImage vSrcImg){if(null == vSrcImg){return null; }int tWidth = vSrcImg.getWidth();int tHeight = vSrcImg.getHeight();  BufferedImage tHsvImg = new BufferedImage(tWidth, tHeight, vSrcImg.getType());//System.out.println("rgb2hsv, vSrcImg.getType()="+vSrcImg.getType());int R,B,G,max, min;float H=0,S=0,V=0;int delta;for(int i=0; i<tWidth; i++){for(int j=0; j<tHeight; j++){int pixel = vSrcImg.getRGB(i, j);R = (pixel & 0xff0000) >> 16;  G = (pixel & 0xff00) >> 8;  B = (pixel & 0xff);float f[] = rgb2hsvF(R, G, B);R = (int)(f[0]*255);G = (int)(f[1]*255);B = (int)(f[2]);int pixel_hsv2= (R << 16) | (G << 8) | B;tHsvImg.setRGB(i, j, pixel_hsv2);if(true){continue;}//用下面这段显示的就有问题,不知道哪里错了//max=Math.max(R, Math.max(G,B));//min=Math.min(R, Math.min(G,B));//if(0 == max){//tHsvImg.setRGB(i, j, 0);//continue; //}////V = max; //delta = max - min; //S = (delta / max);       // s// //if(0 == delta){//H = 0;//}else if(G == max ){//H = 2 + (B - R)  / delta; // between cyan & yellow//}else if(B == max){//H = 4 + (R - G)  / delta; // between magenta & cyan//}else if(R == max){//H =  (G - B) / delta;     // between yellow & magenta//}// //H *= 60; //if(H < 0){//H += 360;//}////R = (int)(H*255/360);//G = (int)(S*255);//B = (int)(V); //int pixel_hsv= (R << 16) | (G << 8) | B;//tHsvImg.setRGB(i, j, pixel_hsv);}} return tHsvImg;}

把lena拿来试一下,跟matlab里面一样





原创粉丝点击