由外掛武器準心取色理解RGB,ESL,HSL空間與HSV空間,願願。
以下有公式:願願就貼圖片啦。
我們玩騰訊生死狙擊遊戲往往,會狙擊打槍後馬上換刀躲避,所以,需要一個輔助工具來,完成這個想法。我推薦的是AutoHotkey。當然你可以選擇按鍵精靈。
首先,我們要取色,判斷該顏色是武器準心顏色。由於RGB空間表示的顏色並不能均勻的描述人類的眼睛的辨色規律,所以有了HSL與HSV顏色空間。
請參閱《關於HSL和HSV顏色空間的詳細論述》學海無涯GL 和《HSL and HSV》Wikipedia以下是兩篇文章的網住地址。
http://www.360doc.com/content/13/1105/14/10724725_326803150.shtml
https://en.wikipedia.org/wiki/HSL_and_HSV
其次,拷貝了RGB空間到HSL空間的轉換程式碼,如下:
/**
* Converts an RGB color value to HSL. Conversion formula
* adapted from http://en.wikipedia.org/wiki/HSL_color_space.
* Assumes r, g, and b are contained in the set [0, 255] and
* returns h, s, and l in the set [0, 1].
*
* @param {number} r The red color value
* @param {number} g The green color value
* @param {number} b The blue color value
* @return {Array} The HSL representation
*/
function rgbToHsl(r, g, b){
r /= 255, g /= 255, b /= 255;
var max = Math.max(r, g, b), min = Math.min(r, g, b);
var h, s, l = (max + min) / 2;
if(max == min){
h = s = 0; // achromatic
}else{
var d = max - min;
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
switch(max){
case r: h = (g - b) / d + (g < b ? 6 : 0); break;
case g: h = (b - r) / d + 2; break;
case b: h = (r - g) / d + 4; break;
}
h /= 6;
}
return [h, s, l];
}
/********程式碼完******/ 再次,要判斷狙擊槍準心位置,可以拷屏,用windows畫圖程式,點網格,來檢視,準心座標,當然,該座標遊戲時,一般在滑鼠位置,就不細說了。
再次,開始取色吧,顏色是紅色,而遊戲中該顏色是有變化的,所以並不是一個簡單的RGB(255,0,0),往往是什麼(197,22,39),(227,42,39)等等亂七八糟的紅色。
但我們人眼是可以識別該色為紅色的。所以我們要將RGB轉成HSL來,判斷,該顏色是不是我們要找的顏色。一般來說:有如下規律
-30<=h<30, 紅色
30<=h<90, 黃色
90<=h<150,綠色
150<=h<210,青色
210<=h<270,藍色
270<=h<330,品紅色
再再次,用windows畫板mspaint中是ESL,而不是HSL,所以需要簡單的轉換下,本質上,ESL與HSL沒有區別,只是取值範圍不同。也就是說,如果ESL的值域是[0,239],[240],[240],HSL的值域分別為[0,360],[0,1],[0,1],那麼我們只要將E除以239,再乘以360,就完成了轉換。反過來,一樣一樣的。
我的程式判斷紅色是這樣的,如下:(autohotkey程式碼)
;//////////////////////////////////////////程式碼開始////////
PixelGetColor, StarColor0, StarX0pos, StarY0pos
;以下為紅色準心判斷條件
;h<(1/30) 且 L>0.333333 且 L<0.625 且 s>0.625
;或者 h>(230/240) 且 L>0.375 且 L<0.625 且 s>0.625
blue:=((StarColor0&0xff0000)>>16)
green:=((StarColor0&0x00ff00)>>8)
red:=((StarColor0&0x0000ff))
imax:= Max(red, green, blue) ;
if(red>140 and red=imax)
{
; 0<h,l,s<1,單精度浮點型小數點後面有效數字為6~7位
r:= red/255.0 ;
g:= green/255.0 ;
b:= blue/255.0 ;
fmax:= r ;
fmin:= min(r, g, b) ;
h:=0.0 ;
s:=0.0 ; 0<h,l,s<1
l:= (fmax + fmin) / 2.0 ;
if(l<0.625 and l>0.33333)
{
if(fmax != fmin)
{
d:= fmax - fmin ;
s:= l > 0.5 ? d / (2 - fmax - fmin): d / (fmax + fmin) ;; 0<h,l,s<1
h:= (g - b) / d + (g < b ? 6 : 0) ;
h /= 6 ;; 0<h,l,s<1
}
if(s>0.625)
{
if(h<0.03333 or (h>0.958333 and l>0.375))
{
return true ;
}
}
}
}
;//////////////////////////////////////////程式碼結束/////
程式碼不好看,直接給你不等式。
條件1:(H<0.03333 且 ( (L>0.333333)且(L<0.625) ) )
條件2:(H>0.958333 且 ( (L>0.375)且(L<0.625) ) )
條件1與條件2是或的關係,滿足其一,就可以判定是人眼可以辨別的準心紅色。(注意,飽和度s都要大於0.625。別說我沒有說,霍霍~~!)
再再次,我們如何理解HSL公式呢,不然讀者不明白其中的道理,如果準心變成綠色就傻眼了。以下願願就詳細給大家推導下。