我有一个应用程序,用户在屏幕上选择一个区域来检测颜色。颜色检测代码工作正常,它扫描并存储RGB和HSV值。
所以这是程序的流程:
因此,用户会获得一张白色纸条,并根据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);
}