RGB转HSV,反之亦然-有什么可以改进的地方?

时间:2018-11-27 15:27:10

标签: c++ image-processing optimization coding-style code-cleanup

这是我的c ++代码。它工作得很好,但是我很好奇我在优化和代码清晰度方面会做错什么。还可以帮助我理解为什么“警告:将浮点数与==或!=比较不安全”吗?

谢谢您的时间:)

这里是RGB到HSV:

struct hsv_struct {
    float h=0,s=0,v=0;
};
struct rgb_struct {
    float r=0,g=0,b=0;
};

hsv_struct rgb_to_hsv(hsv_struct hsv,rgb_struct rgb){
        rgb.r = rgb.r/255.0f;
        rgb.g = rgb.g/255.0f;
        rgb.b = rgb.b/255.0f;
        float max=0,min=0;
        if(rgb.r>rgb.g && rgb.r>rgb.b){ max=rgb.r;
           if(rgb.g<rgb.b) min=rgb.g;
           else min=rgb.b;
           }
        else if(rgb.g>rgb.b){ max=rgb.g;
           if(rgb.b<rgb.r) min=rgb.b;
           else min=rgb.r;
           }
        else{ max=rgb.b;
           if(rgb.r<rgb.g) min=rgb.r;
           else min=rgb.g;
           }
        if (rgb.r==max)     hsv.h=(rgb.g-rgb.b)/(max-min);
        else if(rgb.g==max) hsv.h=(2.0f+(rgb.b-rgb.r)/(max-min));
        else if(rgb.b==max) hsv.h=(4.0f+(rgb.r-rgb.g)/(max-min));

        hsv.h = hsv.h * 60;
        if(hsv.h<0) hsv.h = hsv.h+360;

        hsv.s = (max-min) / max;
        if (max==0) hsv.s=0;

        hsv.v=max;

        return hsv;
}

这里是HSV到RGB:

rgb_struct hsv_to_rgb(hsv_struct hsv,rgb_struct rgb){
    float p, q, t, ff;
    long i;
    if(hsv.v==0.00000f) {
        rgb.r = 0;
        rgb.g = 0;
        rgb.b = 0;
    }
    else {
        if(hsv.h >= 360.0) hsv.h  = 0.0;
        hsv.h  /= 60.0;
        i = floor(hsv.h);
        ff = hsv.h - i;
        p = hsv.v * (1.0f - hsv.s);
        q = hsv.v * (1.0f - (hsv.s * ff));
        t = hsv.v * (1.0f - (hsv.s * (1.0f - ff)));

        switch(i){
        case 0:
            rgb.r = hsv.v;
            rgb.g = t;
            rgb.b = p;
            break;
        case 1:
            rgb.r = q;
            rgb.g = hsv.v;
            rgb.b = p;
            break;
        case 2:
            rgb.r = p;
            rgb.g = hsv.v;
            rgb.b = t;
            break;
        case 3:
            rgb.r = p;
            rgb.g = q;
            rgb.b = hsv.v;
            break;
        case 4:
            rgb.r = t;
            rgb.g = p;
            rgb.b = hsv.v;
            break;
        case 5:
        default:
            rgb.r = hsv.v;
            rgb.g = p;
            rgb.b = q;
            break;
        }
    }
rgb.r*=255;
rgb.g*=255;
rgb.b*=255;
return rgb;
}

不要介意我在这里愚弄“大部分是代码”错误!..我能工作吗?

1 个答案:

答案 0 :(得分:0)

关于浮点运算,请阅读Is floating point math broken?

您还可以将const type_name&结构传递给函数以实现最佳性能