2013-05-16 82 views
1

我正在看的問題是,我想用相當合理的確定性水平檢測圖像是黑色還是大多數黑色。我已經寫了代碼來獲取顏色直方圖,下一步是編寫一個函數,它將採用(r,g,b)元組,並給我一個bool指示它是黑色還是接近它。這可能不是100%準確,但最好是誤報誤報。如何訓練python函數以返回我想要的結果?

def average_image_color(i): 
    h = i.histogram() 

    # split into red, green, blue 
    r = h[0:256] 
    g = h[256:256*2] 
    b = h[256*2: 256*3] 

    # perform the weighted average of each channel: 
    # the *index* is the channel value, and the *value* is its weight 
    return (
     sum(i*w for i, w in enumerate(r))/sum(r), 
     sum(i*w for i, w in enumerate(g))/sum(g), 
     sum(i*w for i, w in enumerate(b))/sum(b)) 

我有一組測試圖像,可以用作語料庫。什麼是最好的圖書館/方法呢?

我會希望培訓會由於您只關注亮度,如果轉換的圖像灰度,所以您只需一起工作會更容易些像

def is_black(r, g, b): 
    if magic_says_black(): 
     return True 
    return False 
+1

請參閱http://en.wikipedia.org/wiki/Supervised_learning和http://en.wikipedia.org/wiki/Unsupervised_learning。你可能想用某種控制數據來監督它,在這種情況下,您只需量化「黑色」是什麼以及您真正想要的寬容程度。 – mdscruggs

+1

考慮到這個問題的定義如此明確且易於理解,只需手工製作一個可以手工完成的算法就可能會更好。例如,如果所有的值都很高,並且它們之間的差異很小,那麼返回true。 – placeybordeaux

+1

另請參閱http://scikit-learn.org/stable/ – mdscruggs

回答

1

功能一個渠道而不是三個渠道。

然後,你有許多選項:

  • 圖像是大多是黑色,如果平均像素強度高於經驗確定的閾值;
  • 計算超過某個閾值的像素數
  • 如果您有大量示例圖像,使用灰度直方圖訓練分類器(如SVM)(這看起來好像使用大錘來破解核桃) 。您會在scikit-learn package中找到很多分類器。