java BufferedImage rgb2hsv

https://blog.csdn.net/wuzuyu365/article/details/77994201

 

做了個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裏面一樣


————————————————
版權聲明:本文爲CSDN博主「wuzuyu365」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/wuzuyu365/article/details/77994201

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章