我正在使用
PHP和MysqL构建一个图像厨房,我希望通过它的颜色实现图像搜索.通过跟随
Imagick::getImageHistogram,我从图像中获得了最多呈现的颜色.
<?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,那么如何从数据库中获取所有最近的匹配图像.
谢谢
你应该正常化这个.
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
检查此链接,了解如何将HEX颜色转换为RGB值:http://bavotasan.com/2011/convert-hex-color-to-rgb-using-php/
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