Converting an RGBW color to a standard RGB/HSB representation

前端 未结 3 1090
不知归路
不知归路 2021-01-03 02:14

I am building an interface for light management in a home automation system. I managed to control standard on/off and dimmable light for various providers with little proble

相关标签:
3条回答
  • 2021-01-03 03:09

    I know this is a fairly old question, but I'm looking at the RGB->RGBW algorithm and found this article which - whilst not the answer - may help?

    http://web.archive.org/web/20101008153429/http://www.nouvoyance.com:80/files/pdf/Adding-a-White.pdf

    In this, they suggest one conversion for RGB->RGBW is simply to create the W from min(R, G, B).

    • R -> R
    • G -> G
    • B -> B
    • W -> min(R, G, B)

    The reverse of this (for your scenario) would simply be to throw away the W.

    • R -> R
    • G -> G
    • B -> B
    • W -> null
    0 讨论(0)
  • 2021-01-03 03:14

    How to convert RGB to RGBW is described in item 2.1 of the following paper

    http://www.mirlab.org/conference_papers/International_Conference/ICASSP%202014/papers/p1214-lee.pdf

    Think of your leds as a huge pixel. Oliver's answer uses Wo = min(Ri,Gi,Bi), what is computationaly cheap and just works. This paper explains other alternatives to minimize power consumption, what is good for a home automation project. I'm also on a home automation project with OpenHAB, Arduino and RGBW leds and on the one hand paper proposed alternative would be good, on the other hand a huge LUT would just not work and convert all values on arduino eighter. I would suggest you to try correcting RGB values using not so energy eficient technics as cited in the paper:

    Assuming Ri, Gi, Bi are color inputs, integers from 0 to 255, so Q = 255 and that your outputs are Wo, Ro, Go and Bo with values from 0 to 255:

    M = max(Ri,Gi,Bi)
    m = min(Ri,Gi,Bi)
    
    Wo = if (m/M < 0.5) use ( (m*M) / (M-m) ) else M 
    Q = 255
    K = (Wo + M) / m
    Ro = floor( [ ( K * Ri ) - Wo ] / Q )
    Go = floor( [ ( K * Gi ) - Wo ] / Q )
    Bo = floor( [ ( K * Bi ) - Wo ] / Q )
    

    Exercise it in a spreadsheet before implementing, experiment on Wo = m, m^2 and -m^3+m^2+m, correct Wo value with the right Qw and you will be surprised that the simple solution without correction is not what one would expect and that other answers do not vary that much. Check the paper for color distortion results, I suppose that if you do not correct RGB values you will end up with some washed out colors.

    0 讨论(0)
  • 2021-01-03 03:20

    I have been reviewing the answer suggested by Roberto but the colors seemed dimmer and undersaturated in many cases. Taking the example of RGB = (255,255,2) leads to RGBW = (128,128,1,2).

    Digging further, it seems that the paper by Chul Lee has an error in its equation for K. The equation, which comes from a paper by Lili Wang ("Trade-off between luminance and color in RGBW displays for mobile-phone usage") is actually:

    K = (Wo + M)/M
    

    Note that it is a capital M, not a lowercase m. Given this change, you also do not need Q since it scales properly by nature. Using the new K on the same RGB = (255,255,2) example leads to a much more reasonable RGBW = (255,255,0,2).

    Putting it all together:

    M = max(Ri,Gi,Bi)
    m = min(Ri,Gi,Bi)
    
    Wo = if (m/M < 0.5) use ( (m*M) / (M-m) ) else M 
    K = (Wo + M) / M
    Ro = floor[ ( K * Ri ) - Wo ]
    Go = floor[ ( K * Gi ) - Wo ]
    Bo = floor[ ( K * Bi ) - Wo ]
    
    0 讨论(0)
提交回复
热议问题