2012-10-27 25 views
3

我有一個像這樣的比例尺地圖:(數字只是一個例子)猜測地圖上的rgb漸變?

Gradient它描述了一個地圖上的單個變量。但是,我無法訪問原始數據,並且幾乎不知道任何關於圖像處理的 。我所做的是使用PIL來獲取地圖上每個點的像素座標和RGB值。只需使用pix = im.load()並將pix[x,y]保存爲每個x,y即可。現在我想用上面的梯度來猜測每個點的值。

是否有這樣的梯度的標準公式?它對訓練有素的眼睛看起來非常熟悉嗎?我曾參觀過Digital Library of Mathematical Functions一些例子......但是我不知道如果它使用的色調,將RGB高度函數或別的東西(爲了方便起見,我還色盲一些果嶺/眉毛/紅色):)

如何進行,庫,鏈接或想法的任何提示讚賞。謝謝!

編輯:

繼答覆和馬蒂諾的建議,我試圖抓住頂部的顏色和底部:

def rgb2hls(colotup): 
    '''converts 225 based RGB to 360 based HLS 
    `input`: (222,98,32) tuple''' 

    dec_rgb = [x/255.0 for x in colotup] # use decimal 0.0 - 1.0 notation for RGB 
    hsl_col = colorsys.rgb_to_hls(dec_rgb[0], dec_rgb[1], dec_rgb[2]) 
    # PIL uses hsl(360,x%,y%) notation and throws errors on float, so I use int 
    return (int(hsl_col[0]*360), int(hsl_col[1]*100), int(hsl_col[2]*100)) 


def pil_hsl_string(hsltup): 
    '''returns a string PIL can us as HSL color 
    from a tuple (x,y,z) -> "hsl(x,y%,z%)"''' 
    return 'hsl(%s,%s%%,%s%%)' % (hsltup[0], hsltup[1], hsltup[2]) 


BottomRed = (222,98,32) # taken with gimp 
TopBlue = (65, 24, 213) 

hue_red = pil_hsl_string(rgb2hls(BottomRed)) 
hue_blue = pil_hsl_string(rgb2hls(TopBlue)) 

但是他們出來很不同......這使我擔心使用rgb_to_hls函數來提取值。或者我是在做一些非常錯誤的事情?這是什麼顏色與代碼轉換爲: enter image description here

回答

2

有趣的問題..

如果從250,85%,85%的人在HSL色彩空間順時針走 - > 21,85%,85%,你會得到一個梯度非常接近你展示的那個。顯而易見的區別在於您的圖片顯示出相當窄的綠色值。

所以,如果你有4張幻數,那麼你可以插值到地圖中的任意位置。

這些當然是第一個也是最後一個顏色,也是第一個和最後一個比例值。 這是我在H通道上用直線性漸變獲得的圖像(使用gimp)。 enter image description here

編輯:我已經掀起了一個程序,抓住每行的像素值,繪製結果。你可以看到,確實色調不是線性的,你也可以看到V通道在115左右(從圖像頂部115像素)處確定下降。這確實對應於綠色帶。

鑑於曲線的形狀,我傾向於認爲它們可能是爲了模擬某些東西。但是沒有相關領域的經驗來識別曲線的形狀。

下面,我添加了HSV和RGB模型中的變化圖。 圖的左側表示條的頂部。 X軸標籤代表像素

非常有趣,我想。書籤。

enter image description here

enter image description here

+0

很酷!我不知道這是否存在,或者你可以在gimp上閱讀HSV。它還揭示順時針HSV不完全匹配梯度。 – Massagran

+1

@Massagran - 是的,非常整齊。甚至可以得到一個製作立體圖的gimp插件,但我離題了。一直想着這個漸變,我認爲,而不是一個單一的漸變,他們已經使用2.1從橙色到(只是越來越)綠色。第二個從(剛剛結束)綠到藍。我估計你的地圖上的120對應於連接點。我也認爲漸變可以避免在我的圖像中顯示的部分從大約100到130.知道必須有這個工具/設置組合使用! – enhzflep

+0

@enhzlep,現在你提到它放大顯示漸變可以說「加速」放大到這個:http://i.imgur.com/aSw93.png並注意每個顏色不佔用相同的寬度就像它在gimp漸變中那樣(即中間的黃色更長,當你接近結束時紅色和藍色變短)。 – Massagran

2

圖像中的規模看起來像一個HSV梯度對我來說,有點像什麼是this question提及。如果是這樣,您可以使用colorsys.rgb_to_hls()colorsys.rgb_to_hsv()函數從像素中的r,g,b值中獲取介於0和1之間的色調顏色值。那可以相應地映射。

然而,短期做OCR的,我不知道如何確定所代表的值的範圍,除非它是你可以硬編碼了一些一致的範圍。

2

我會建議以界定區域要比較出彩。對區域進行FFT。每種顏色都由一個頻率定義。你在這個等級上也是這樣做的。然後比較並縮小一個值。

我發現有些人想要更好地理解它。

http://www.imagemagick.org/Usage/fourier/