2009-11-10 41 views
5

假設圖庫中有10,000張JPEG,PNG圖像,如何找到所有圖像具有類似調色板的圖像,並按照相似性降序排列?使用Python查找帶有類似顏色調色板的圖像

+2

可能重複:http://stackoverflow.com/questions/593925/how-do-i-find-images-with-a -similar-color-using-python-and-pil – ChristopheD 2009-11-10 00:08:30

+0

是的,但在這個問題上沒有很好的答案。 :-) – 2009-11-10 00:35:49

+0

這裏有很多類似的討論: http://stackoverflow.com/questions/1034900/near-duplicate-image-detection/1048723#1048723 – Paul 2009-11-10 00:40:11

回答

10

爲每個圖像構建顏色直方圖。然後,當您想要將圖像與集合進行匹配時,只需根據其直方圖與選定圖像的直方圖的接近程度對列表進行排序即可。

桶的數量取決於你想要的精度。組合成一個存儲桶的數據類型將定義您如何優先搜索。

例如,如果你最感興趣的色調,那麼你可以定義鬥圖像的每個像素進入爲:

def bucket_from_pixel(r, g, b): 
    hue = hue_from_rgb(r, g, b) # [0, 360) 
    return (hue * NUM_BUCKETS)/360 

如果你也想一般的匹配,那麼你就可以根據完整的RGB值選擇存儲桶。

使用PIL,您可以使用內置histogram函數。可以使用任何您想要的距離度量來計算「貼近度」直方圖。例如,L1距離可以是:

hist_sel = normalize(sel.histogram()) 
hist = normalize(o.histogram()) # These normalized histograms should be stored 

dist = sum([abs(x) for x in (hist_sel - hist)]) 

的L2將是:

dist = sqrt(sum([x*x for x in (hist_sel - hist)])) 

Normalize只是迫使直方圖的總和等於某一常數的值(1.0正常工作)。這很重要,因此可以將大圖像與小圖像進行正確比較。如果你打算使用L1距離,那麼你應該使用normalize中的L1度量。如果L2,那麼L2。

+0

@Frank,謝謝你的建議。你能給我一些Python代碼示例嗎? PIL的內置直方圖()函數返回一個列表,如何確定兩個圖像的直方圖有多接近? – jack 2009-11-10 00:18:17

+0

@Frank,看起來像是在10,000個候選人中選擇具有相似直方圖的圖像時需要進行10,000個距離計算?是否有可能將數值與每個圖像相關聯並將它們存儲在數據庫中,因此可以將比較簡化爲一些sql查詢? – jack 2009-11-10 01:55:41

+0

@jack,10,000計算並不那麼昂貴。像這樣加速代碼的最佳方式不是將直方圖減少爲整數(不能按照您的想法完成),而是簡單**緩存**結果。緩存數據庫中的排序順序(每個圖像)或將其緩存在內存中。確保您還將直方圖存儲在數據庫或內存中,以便重建這些排序順序緩存並不昂貴。 – 2009-11-10 02:07:34

相關問題