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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值