【发布时间】:2012-07-25 02:08:16
【问题描述】:
我在我的照片网站上按颜色功能进行了搜索。为此,我遍历了一张图像中的所有像素,并在我的数据库中记录了前 10 个像素。我遇到的问题是,因为我的照片有人物主题,所以我的搜索者真的在搜索主题的颜色,而不是背景(天空、铺路、草等)。我知道这将很难完全消除,但我想我需要稍微改变颜色以获得更好的效果。
请看这张照片的例子:
左边的例子是我正在做的,收集所有像素。黑色和灰色占据了该选择的前 3 种颜色,粉红色第 4 位,背景女孩连衣裙的海军蓝色第 5 位——我只收集前 5 种颜色,而我的主色并不是那么好。如果我可以改变循环像素的方式,只选择绿色框中的颜色(右),我认为这会对我的收藏产生一点影响。这就是我很难看到数学的地方。
我这样做是为了遍历所有像素:
$size = @getimagesize($imageFile);
for ($x = 0; $x < $size[0]; $x += $granularity) {
for($y = 0; $y < $size[1]; $y += $granularity) {
// do stuff here
}
但我需要将其更改为从顶部和底部减少大约 5%,从侧面减少大约 8-10%,然后循环通过新选择。
我确实开始了,但后来停止了,因为我不确定我的计算是否返回奇数或像 1.030044858 这样的数字。
这是我走了多远,希望有人能帮我清理一下,让我越过这条线:
$granularity = 4;
$granularity = max(1, abs((int)$granularity));
$size = @getimagesize($imageFile);
$sizeX = $size[0];
$sizeY = $size[1];
$xPerCent = 8; // for me to set & adjust
$yPerCent = 5; // for me to set & adjust
$xSelectionWidth = ($sizeX/100) * $xPerCent;
$xSelectionWidth = $sizeX - ($xSelectionWidth * 2);
$xSelectionHeight = ($sizeY/100) * $yPerCent;
$xSelectionHeight = $sizeY - ($ySelectionHeight * 2);
$xSelectionStart = 0;
$xSelectionEnd = 0;
$ySelectionStart = 0;
$ySelectionEnd = 0;
for($x = 0; $x < $size[0]; $x += $granularity) {
for($y = 0; $y < $size[1]; $y += $granularity) {
// do stuff here
}
}
【问题讨论】:
-
您可能需要考虑一种加权机制,而不是制作这样的盒子。图像中间的像素值 5 个像素,边缘附近的像素值 1/2 个像素,当您远离中间时会有一些渐变。您必须进行试验才能看到哪种渐变会给您带来好的结果。
-
首先计算你想要切掉侧面和顶部的百分比 (
$xSelectionChop = ($sizeX/100) * $xPercent;),然后在你的 for 循环中执行for($x = $xSelectionChop; $x < $sizeX - $xSelectionChop; $x += $granularity)?