4

我在我的照片网站上按颜色功能进行了搜索。为此,我遍历了一张图像中的所有像素,并在我的数据库中记录了前 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
    } 
} 
4

1 回答 1

0

如果您想忽略图片中的某些内容,我建议您将其转换为黑白并获取最大的白色区域(您需要设置转换的详细信息以确保您不会将所有非白色都变成黑色)。

我的意思是红色,肤色应该设置为白色,紫色为黑色。在这种情况下,背景和任何深色表面都是黑色的。阅读http://www.switchonthecode.com/tutorials/csharp-tutorial-convert-a-color-image-to-grayscale它是一个很好的介绍,但是,我说的是真正的黑白,所以你可以调整/适应这个一。

这将极大地帮助您将注意力集中在图像的正确部分。

B&W 表单识别越准确,您就越能识别出您的颜色对象。有关模式识别的详细信息,请阅读http://en.wikipedia.org/wiki/Pattern_recognition 。

获取您想要在原始图像中查看的一组坐标。

对不起,我不是 PHP 人,我不能以这种方式更具体,但我希望这会对你有所帮助......

于 2012-07-26T13:45:42.783 回答