1. 程式人生 > >由外掛武器準心取色理解RGB,ESL,HSL空間與HSV空間,願願。

由外掛武器準心取色理解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公式呢,不然讀者不明白其中的道理,如果準心變成綠色就傻眼了。以下願願就詳細給大家推導下。