计算两个RGB值之间的颜色差异;或两个HSV值

时间:2014-06-17 16:54:12

标签: objective-c colors rgb hsv

我有一个应用程序,用户在屏幕上选择一个区域来检测颜色。颜色检测代码工作正常,它扫描并存储RGB和HSV值。

所以这是程序的流程:

  1. 用户点击" Calibrate"其中所选择的屏幕区域校准当前的"白色"值并将它们存储在应用程序中。这不一定是白色的;例如,用户可以将任何东西校准为白色。但我们假设他们知道白色是什么并正确校准。
  2. 因此,用户会获得一张白色纸条,并根据RGB和HSV的值校准应用程序:

    WR:208 WG:196 WB:187 WH:25.814 WS:.099194 WV:0.814201
    

    现在,208,196,187的RGB显然不会产生" true"白色,但这是用户校准它的原因,因为照明不是很完美。

    所以

    因为我有" Calibrated white&#34 ;;我现在可以从相机中获得第二组变量。但是我想知道颜色何时与白色有一定程度的差异。

    所以,例如;我拿了一张不同程度紫色的纸条。在一端,紫色与白色无法区分,随着纸张长度的增加,它逐渐变得更接近固体;深紫色。

    假设用户将设备校准为前面所述的白色值。

    让我们说用户测试条带并相应地接收新的RGB和HSV值:

    R:128 G:49: B:92 H:326 S:.66 V:.47
    

    现在这就是我被卡住的地方。假设我已经检索了这两个值;如何使用各自的V来缩放颜色。如何准确计算颜色是否与校准的白色相比有20%的差异"或类似的东西。

    我做了一些简单的比较:

    NSLog(@"testing");
    if(r <= whiteR*whiteV && g <= whiteG*whiteV && b <= whiteB*whiteV){
        NSLog(@"TEST PASSED");
        [testStatusLabel setText:[NSString stringWithFormat:@"PASS"]];
        [testStatusLabel setTextColor:[UIColor greenColor]];
    }
    else{
        [testStatusLabel setText:[NSString stringWithFormat:@"FAIL"]];
         [testStatusLabel setTextColor:[UIColor redColor]];
    }
    

    但不应该通过的测试正在通过;例如,当我将条带校准为白色然后我测试另一张白纸时,它有时会过去......

    如有需要,请要求进一步澄清。

    修改1:

    我在这里发现了一些伪代码,它们可以解决HEX(RGB)颜色代码之间的问题。但它没有考虑不同的V(闪电亮度)值。

    function color_meter(cwith, ccolor) {
    
        if (!cwith && !ccolor) return;
    
        var _cwith  = (cwith.charAt(0)=="#") ? cwith.substring(1,7) : cwith;
        var _ccolor = (ccolor.charAt(0)=="#") ? ccolor.substring(1,7) : ccolor;
    
        var _r = parseInt(_cwith.substring(0,2), 16);
        var _g = parseInt(_cwith.substring(2,4), 16);
        var _b = parseInt(_cwith.substring(4,6), 16);
    
        var __r = parseInt(_ccolor.substring(0,2), 16);
        var __g = parseInt(_ccolor.substring(2,4), 16);
        var __b = parseInt(_ccolor.substring(4,6), 16);
    
        var p1 = (_r / 255) * 100;
        var p2 = (_g / 255) * 100;
        var p3 = (_b / 255) * 100;
    
        var perc1 = Math.round((p1 + p2 + p3) / 3);
    
        var p1 = (__r / 255) * 100;
        var p2 = (__g / 255) * 100;
        var p3 = (__b / 255) * 100;
    
        var perc2 = Math.round((p1 + p2 + p3) / 3);
    
        return Math.abs(perc1 - perc2);   
    }
    

0 个答案:

没有答案