php - 如何使用 imagick 或其他库查找图像中的边缘坐标?

php - how to find coordinates of edges in an image using imagick or other library?

给定一个由纯黑色区域组成的图像,其中某处有一个白色矩形,我如何提取矩形的坐标?我在谷歌上搜索了又搜索,找到了许多关于使用霍夫线、卷积、形态学等进行边缘检测的文章,但所有这些实际上都对图像进行了边缘处理或以某种方式对其进行了转换。我不想改变图像,我只想找到边缘在哪里。

显然,我可以简单地遍历图像的整个宽度和高度并查看像素颜色(如某些帖子所建议的),但这似乎效率极低。没有内置算法吗?看起来这一定是某处 imagick 的一部分,否则它怎么能真正找到并绘制内部图像的边缘?但我不知道如何获取它。

$base = new Imagick(realpath('./trim.png'));
$base->trimImage(0);
// get the new image size
$geometry = $base->getImageGeometry();
// Retrieve the trim info
$pageInfo = $base->getImagePage();

手册页上有一个类似的例子: http://php.net/manual/en/imagick.trimimage.php#111332

看来问题的完整解决方案如下:

$im->trimImage(0);
$pagedata = $im->getImagePage();
$x = $pagedata['x'];
$y = $pagedata['y'];
$im->setImagePage(0, 0, 0, 0);
$w = $im->width;
$h = $im->height;

在获取高度和宽度之前未设置图像页面return整个原始图像的高度和宽度,如您引用页面上的注释所示。

事实证明,如果您处理的是使用透明度的图像,则解决方案会更简单;只是 getImagePage() 函数而已:

$im = new Imagick(realpath('./image.png'));
$pagedata = $im->getImagePage();
$x = $pagedata['x'];
$y = $pagedata['y'];
$w = $pagedata['width'];
$h = $pagedata['height'];
print("x,y: $x, $y<br>\n");
print("w,h: $w, $h<br>\n");

出于某种原因,如果将 trimImage(0) 用于此透明图像,则 (x,y) 坐标将设置为 (-1,-1)。不幸的是,我对 imagick 的了解还不够多,无法说明为什么会这样。也许你可以回答这个问题,@danack ?