以下是最初理论,最新的算法实现请看此篇文章: https://blog.csdn.net/longkey_zsb/article/details/89211622
优化方案三的相似度结果:
色调差异=SX1-SX2 //色调值可以从公式计算出来
if 色调差异<42 Then
方案三结果= (SX1-SX2)*Max(SN1,SN2)/255 //相同色调比较,毕竟浓度差异大时,公式结果直接会判断采用方案二的结果
else
if (SN1,SN2)/辨识力)>1 then //色彩浓度足够识别
方案三结果=255
else
方案三结果=(Max(SN1,SN2)/辨识力)*255 //不相同色调比较,只看色彩浓度和辨识力
end if
Set Color1 = (New rgbClass)(0,255,0) ' T=Timer :Dim Color:Color=RGB(22,100,200)
Set Color2 = (New rgbClass)(0,28,0)
WScript.Echo "Color1:"&Color1.GetColorMsg()&"("&Color1.R&","&Color1.G&","&Color1.B&") Color2:"&Color2.GetColorMsg()&"("&Color2.R&","&Color2.G&","&Color2.B&")"
WScript.Echo "浓度"& Color1.SN &"--"& Color2.SN &" 浓度差="&Abs(Color1.SN-Color2.SN)
WScript.Echo "亮度"& Color1.XLD &"--"& Color2.XLD &" 亮度差="&Abs(Color1.xld-Color2.xld)
WScript.Echo "色调"& Color1.SX &"--"& Color2.SX &" 色调="&Abs(Color1.sx-Color2.sx)
[亮度差]=Abs(Color1.xld-Color2.xld)
[浓度差]=Abs(Color1.SN-Color2.SN)
[色调距离]=Abs(Color1.sx-Color2.sx)
[辨识力]=25
If [色调距离]<42.5 Then '同色调
[色调差]=[色调距离]*Max(Color1.SN,Color2.SN)/255
WScript.Echo "同色结果"&[色调差]
Else '色调相差比较大
If Max(Color1.SN,Color2.SN)/[辨识力]>1 Then '色彩浓度比较大时
[色调差]=255
WScript.Echo "大距离色调结果1:"&[色调差]
Else
[色调差]=Max(Color1.SN,Color2.SN)/[辨识力] * 255
WScript.Echo "大距离色调结果2:"&[色调差]
End If
End If
[相似度]= Max( Max([亮度差],[浓度差]) , [色调差] )
WScript.Echo "最终相似度结果="&[相似度]
测试例子( 下图从操作系统自带画图软件截取,亮度和色调计算方式与本文不同)
程序输出结果
Color1:红-红(255,128,128) Color2:红-紫(255,128,158)
浓度:127--127 浓度差=0
亮度:191.5--191.5 亮度差=0
色调 :0--20 色调距离=20
同色结果:9.96078431372549
最终相似结果=9.96078431372549
计算方法还有点问题,过几天再修正了。
最新的算法实现请看此篇文章: https://blog.csdn.net/longkey_zsb/article/details/89211622