【问题标题】:RGB to HSV and vice versa - what can be improved?RGB 到 HSV,反之亦然 - 有什么可以改进的?
【发布时间】:2018-11-27 15:27:10
【问题描述】:

这是我的 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;
}

别介意我来这里是为了愚弄“主要是代码”的错误!..我工作吗?

【问题讨论】:

  • 如果代码真的“工作得非常好”,并且您只想查看此工作代码(以改进它),那么我建议您改为在CodeReview 上发帖。别忘了先检查what you can ask about there
  • 编译器不相信你在 0.00000f 上的测试是洁净的。这很可疑,添加更多零并不能使其更准确。 if (hsv.v
  • 感谢您的建议,我也将在那里发布我的代码。
  • 谢谢汉斯!固定并记住:)

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


【解决方案1】:

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

您还可以将结构作为const type_name&amp; 传递给函数以获得最佳性能

【讨论】:

    猜你喜欢
    • 2015-03-19
    • 2011-12-28
    • 2019-11-11
    • 2010-09-17
    • 2011-02-02
    • 2012-10-31
    • 2014-12-02
    • 2014-11-08
    • 2012-02-16
    相关资源
    最近更新 更多