6

最近我從CIA world factbook下載了一些標誌。現在,我想「分類。自動識別圖像中的圖案

  1. 獲取顏色
  2. 得到一些形狀(星星,月亮等)

在瀏覽時我遇到了Python的圖片庫,讓我來提取顏色(即,Austria

#!/usr/bin/env python 
import Image 
bild = Image.open("au-lgflag.gif").convert("RGB") 
bild.getcolors() 
[(44748, (255, 255, 255)), (452, (236, 145, 146)), (653, (191, 147, 149)), ...)] 

我發現這裏的怪是奧地利國旗只有兩個顏色,但上面的輸出顯示十餘你知道。爲什麼?我的想法是隻計算前5種顏色,因爲我不感興趣顏色我會做一些「正常化」的數字到64的倍數(所以(236,145,146)變成(192,128, 128))。

但是目前我不知道提取更多信息的最佳方式是什麼(如果圖像中有星星,或者其他)。你能給我一些關於如何去做的提示嗎?

在此先感謝

+4

這是中央情報局。也許他們已經使用隱寫術通過微妙地調整顏色來對標誌圖像中的祕密消息進行編碼......現在你已經在這裏炫耀了它。跑! – 2010-07-14 22:43:06

+6

好吧,當我正在讀這本書時,有一輛麪包車停在我門前。哦,什麼是$&%$&連接丟失 – qbi 2010-07-14 22:57:43

回答

8

Python圖像庫 - PIL只是做基本的圖像處理 - 開放,一些變換或過濾器,並保存爲其他格式。

模式識別是高級圖像處理領域的一部分,也在不斷髮展 - 它使用的算法遠遠不同於PIL中的算法。你可以在Python中使用一些庫和框架來進行模式識別 - (識別恆星和衛星等等) - 雖然我提前給你:如果你想要這樣做只是爲了分類one0-hundered-and-a-很少coutnry標誌,你應該手動做,而不是嘗試潛水模式識別。

您對顏色數量的評論意味着您根本不使用計算機圖像。模式識別是硬核,即使是python前端。 (例如,你不能指望任何當前的框架事先知道什麼是「月亮」或「星星」)

因此,對於少於500張圖片,您可以使用軟件,允許您手動標記圖像並編寫一些代碼將標籤鏈接到每個標誌。

至於顏色:計算機光柵化圖像由像素組成。這些是Square。在不同顏色之間的邊界上,如果像素是一種顏色(如白色),並且其鄰居是完全不同的顏色(如紅色),則此邊界將顯示爲鋸齒狀。這被稱爲「別名」。爲了消除這種情況,計算機軟件在硬邊界處混合顏色,創建中間色 - 這就是爲什麼即使具有2種明顯顏色的PNG也可以在內部具有多種顏色的原因。對於.JPG來說,情況更糟,因爲我們使用的RGB顏色的四捨五入數字甚至不像它們在圖像中那樣存儲。

與模式識別不同,您可以通過僅使用每個組件的最高有效位來縮小所看到的顏色數量。我會說這兩個最重要的位就足夠了。 下面的Python功能可能用一個顏色由PIL計數給出:

def get_main_colors(col_list): 
    main_colors = set() 
    for index, color in col_list: 
     main_colors.add(tuple(component >> 6 for component in color)) 
    return [tuple(component << 6 for component in color) for color in main_colors] 

與稱它爲 「get_main_colors(bild.get_colors())」 爲例。

這裏是處理模式識別部另一個問題: python image recognition

6

首先一些快速術語,以防萬一:

分類器學習地圖輸入到輸出。您可以通過輸入/輸出對來訓練分類器,例如特徵向量,如顏色信息和「捷克國旗」等標籤。在實踐中,標籤被表示爲標量數字。在你的例子中,你有一個多類問題,這只是意味着有兩個以上的可能標籤(顯然,因爲有兩個以上的國家標誌)。培訓多類分類器可能比香草二元分類器稍微複雜一點,因此您可能需要搜索諸如「多分類分類器」或「一對多分類器」等術語來調查最佳方法。

上的問題:

我認爲你的問題可能會使用一個簡單的分類易於解決,如K近鄰,與顏色直方圖作爲特徵向量。特別是,我會使用HSV特徵向量而不是RGB特徵向量。使用這種簡單的分類器系統在文獻中報道了一些很好的結果,例如:SVMs for Histogram-Based Image Classification。在那篇文章中,作者使用了一種稱爲支持向量機(SVM)和HSV特徵向量的特定分類器。 HSV特徵向量也迴避了圖像縮放和旋轉的問題,例如1024x768對比640x480的標誌,或者在圖像中旋轉45度的標誌。

訓練算法將看起來像這樣的僞代碼:

# training simple kNN -- just compute feature vectors, collect labels 
X = [] # tuple (input example, label) 
for training_image in data: 
    x = get_hsv_vector(training_image) 
    y = get_label(training_image) 
    X.append((x,y)) 

# classification -- pick k closest feature vectors 
K = 3  # the 'k' in kNN -- how many similar featvecs to use 
d = [] # (distance, label) tuples for scoring 
x_test = get_hsv_vector(test_image) # feature vector to be classified 
for x_train in X: 
    d.append((distance(x_test[0], x_train), x_test[1]) 

# sort distances, d, by closeness and pick top K labels for scoring 
d.sort() 
output = get_majority_vote([x[1] for x in d[:K]]) 

的kNN分類有幾種蟒蛇封裝,具有良好的文檔。轉換到HSV色彩空間也應該很容易。如果你沒有達到你想要的結果,你可以嘗試改進你的特徵向量或分類器。