【问题标题】:PHP - Find coordinates of group of pixel with similar color within a picturePHP - 在图片中查找具有相似颜色的像素组的坐标
【发布时间】:2014-04-03 10:25:29
【问题描述】:

我正在尝试使用 PHP 获取图片中具有相似颜色的像素组的坐标。我想我必须使用 imagick,但是在互联网上搜索了一段时间后,我找不到我想要的东西。

假设我的基本图片完全是白色的,上面有几个彩色形状。 我想得到这些形状的坐标。它不必是精确的坐标,只要整个形状都在其中。 有点像人脸识别,只是简单得多。

不幸的是,我什至不知道从哪里开始。我想过每 5 个像素比较平均像素颜色以映射整个图片,但这太耗时了。 可能已经存在执行类似操作的函数,但我找不到它们。

我可以完全控制服务器(Linux CentO),所以我可以安装任何需要的附加库。

感谢您的宝贵时间。

【问题讨论】:

  • 我想说看看边缘检测算法。这些都是现成的并且已经优化。不过,我从来没有用 imagick 做到这一点。
  • 边缘检测算法也会遍历所有像素 - 这是一个非常简单的示例:emanueleferonato.com/2010/10/19/…
  • 您有其中一种算法的关键字/名称来帮助我搜索吗?
  • 我看看那个链接,谢谢。

标签: php image imagick


【解决方案1】:

有一个最常见的 PHP GD 库。

一个名为 imagecolorat() 的函数返回指定坐标处的颜色。

是的,您需要比较图像中的每个像素,或者如果适合您的需要跳过五个像素。

【讨论】:

    【解决方案2】:

    您尝试做的事情并不像看起来那么简单。我不认为有一个特定的功能可以像您尝试做的那样将图像分解为区域/精灵。

    不过用下面的代码和伪代码做起来也不是太难:

    //Load the image
    $imagick = new Imagick(realpath("../images/image.png"));
    
    //Get access to the actual pixels of an image
    $imageIterator = $imagick->getPixelRegionIterator(0, 0, $imagick->getImageWidth(), $imagick->getImageHeight());
    
    foreach ($imageIterator as $row => $pixels) { 
        foreach ($pixels as $column => $pixel) {  
                $color = $pixel->getColor();
    
                $spriteMapper->addPixel($color, $row, $column);
            }
        }
        $imageIterator->syncIterator(); /* Sync the iterator, this is important to do on each iteration */
    }
    
    
    class SpriteMapper {
    
        private $regions = array;
    
        function addPixel($color, $row, $column) {
            //If $color is background {
            //    return;
            //}  
            //
            //$found = false;
            //foreach ($regions as $region) {
            //    if ($row and $column are next to $region){
            //        make $region larger
            //        $found = true;
            //   }
            //}  
            //
            //if ($found === false) {
            //   $regions[] = new Region($row, $column);
            //}
        }
    }
    

    您仍然需要准确定义区域重叠时会发生什么,以及准确定义重叠的含义。在您的示例图像中,底部精灵似乎是分开的,但您认为它们是重叠的以标记区域。

    是的,这样做会相对较慢 - 但只要您不是为每个网络请求都这样做,这应该不是问题。

    顺便说一句,您可能希望搜索https://gamedev.stackexchange.com/ 以查找与此类似的问题,因为这是

    【讨论】:

    • 我决定采用“蛮力”的方式,并制作了一个很好的算法来满足我的需求。无论如何感谢您的帮助,我一定会检查您的链接以改进我的代码。
    • @Queno 你能发布你的解决方案吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多