我正在尝试使用PHP获取图片中具有相似颜色的像素组的坐标。我想我必须使用imagick,但在网上搜索后我找不到我想要的东西。
假设我的基本图片是完全白色的,上面有几个彩色的形状。 我想得到那些形状的坐标。只要整个形状在其中,它就不必是精确的坐标。 有点像脸部识别,除了简单得多。
不幸的是,我甚至不知道从哪里开始。我想过每5个像素比较平均像素颜色来映射整个图片,但这会耗费太多时间。 可能已有的功能可以做到这一点,但我找不到它们。
我可以完全控制服务器(Linux CentOs),因此我可以安装任何所需的附加库。
感谢您的时间。
答案 0 :(得分:0)
答案 1 :(得分:0)
你要做的事情并不像看起来那么简单。我不认为有一个特定的功能可以将图像分解成像你想做的那样的区域/精灵。
然而,使用下面的代码和伪代码并不太难:
//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/中搜索与此类似的问题,因为这是