2013-09-26 56 views
4

我正在使用PHP和MySQL構建圖像廚房,我想實現圖像搜索的顏色爲。通過以下Imagick::getImageHistogram我從圖像中獲得了最多的顏色。數據庫設計在MySQL中存儲圖像顏色模式用於搜索圖像顏色

<?php 
$image = new Imagick("thing.png"); 
$pixels=$image->getImageHistogram(); 
foreach($pixels as $p){ 
$colors = $p->getColor(); 
foreach($colors as $c){ 
     print("$c\t"); 
} 
print("\t:\t" . $p->getColorCount() . "\n"); 
} 
?> 

This will print out something like: 

Red Green Blue  Alpha : No of times appeared 
252 250  252  1  :  125 
194 156  182  1  :  126 
109 18  79   1  :  11440 
2  117  162  1  :  12761 
255 255  255  1  :  40769 

雖然我與得到的顏色做,我堅持設計色彩信息存儲與數據庫中的圖像路徑沿着數據庫。

我的問題是如何設計一個數據庫(表結構)來存儲這種數據,其中搜索可以查詢可以有效地應用。

更新:

其次我怎樣才能得到一個匹配的彩色圖像。假設用戶正在搜索顏色#ff0000,那麼我怎樣才能從數據庫中獲取所有最接近的匹配圖像。

謝謝

+0

到目前爲止你有什麼?這些數據看起來不錯並且很規則,所以它應該相當簡單,對吧? – Halcyon

+0

潛在的查詢會是什麼樣子? – Steve

+1

@FritsvanCampen假設我爲圖像存儲6種顏色,這意味着我們有18個整體值(6 *(R,B,G))值。所以如何設計表格來存儲這些值 – Minion

回答

0

你爲什麼不創建一個具有以下字段的數據庫表:

圖像表

id 
name 
red 
green 
blue 
alpha 
+0

很好,但是這與圖像一起存儲一種顏色。其他顏色呢? – Minion

+0

你好,還有其他什麼顏色? RGB值在可見光譜中創造了幾乎所有的顏色... http://en.wikipedia.org/wiki/RGB_color_model – Gravy

+0

閱讀問題...他的輸出是:出現在1張圖片中的最多顏色(顏色#123456出現100次,顏色#444444出現50次.... ....) – DanFromGermany

0

你怎麼樣第一次全部由數量的紅色值他們出現的次數,然後將這些值加在一起得到整體紅色值。然後除以出現的總次數。對綠色和藍色也一樣。

例如:

total red = ((252*125)+(194*126)+(109*11440)+(2*12761)+(255*40769)) 
      /(125 + 126 + 11440 + 12761 + 40769) 
      = 180 

然後把它們存儲在數據庫中像

   id   red  green  blue  image_path 
Image 1  1   225  134   4  /dir/ 
Image 2  2   143  0   145  /dir/ 
Image 3  3   239  200   111  /dir/ 

如果你正在尋找你可以不喜歡紅色圖片:

SELECT id, image_path WHERE red > 200 AND blue < 100 AND green < 100 

林不確定具體情況,但你可能會搞砸這些值。

3

您應該對此進行標準化。

3表:

Image {image_id, name} 
Colors {color_id, red, green, blue, alpha} 
ImageHasColor {image_id, color_id, number_of_times_appeared} 

插入數據應該是簡單,使用...insert_id函數來獲取從您剛插入的行的ID。

選擇與連接,如:

SELECT * FROM 
Image i 
JOIN ImageHasColors h 
ON i.image_id = h.image_id 
JOIN Colors c 
ON c.color_id = h.color_id 
ORDER BY i.image_id 

檢查如何十六進制顏色轉換爲RGB值此鏈接:http://bavotasan.com/2011/convert-hex-color-to-rgb-using-php/

搜索排名前10位真紅圖片:

SELECT * FROM 
Image i 
JOIN ImageHasColors h 
ON i.image_id = h.image_id 
JOIN Colors c 
ON c.color_id = h.color_id 
WHERE c.red > 200 
AND c.green < 50 
AND c. green < 50 
ORDER BY h.number_of_times_appeared 
LIMIT 10 

搜索,而黑色圖片:

SELECT * FROM 
Image i 
JOIN ImageHasColors h 
ON i.image_id = h.image_id 
JOIN Colors c 
ON c.color_id = h.color_id 
WHERE c.red < 30 
AND c.green < 30 
AND c. green < 30 
ORDER BY h.number_of_times_appeared 
LIMIT 10 
+0

謝謝。我如何通過傳遞顏色來獲取所有圖像。假設我正在尋找紅色#ff0000,我怎樣才能得到最接近的所有圖像匹配? – Minion

+0

請檢查更新的問題 – Minion

+0

我會嘗試此代碼並通知您。謝謝 – Minion