2016-01-22 51 views
0

给定一个图像组成的一个简单的黑色领域与一个单一的白色矩形里面,我怎么能提取矩形的坐标?我搜索了谷歌搜索,并发现了许多关于使用霍夫线,卷积,形态学等边缘检测的文章,但所有这些实际上都会影响图像或以某种方式进行转换。我不想改变图像,我想要做的就是找到边缘。很明显,我可以简单地遍历整个图像的宽度和高度,并查看像素颜色(如一些帖子所示),但这看起来非常低效。有没有内置算法?似乎这一定是imagick某个地方的一部分,否则它怎么可能找到并画出内部图像的边缘?但我很难找到如何解决这个问题。php - 如何使用imagick或其他库找到图像边缘的坐标?

回答

1
$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

+0

嗯 - 12.9k声望和代码专用答案? Mhhh,如果你可以添加一些单词,会很好。 ([来自评论](http://stackoverflow.com/review/low-quality-posts/10996110)) –

+1

@CharlotteDunois我已经回答了109个问题,标记为'Imagick',总的upvote计数为... 84。其中一些答案花了几个小时写下来。我的答案可能很简短,这不应该太令人惊讶。 – Danack

+0

谢谢丹达克,您的解决方案让我走上正轨。实际上,还需要一步才能使其工作 - 手册页面注释中提到的setImagePage()。所以完整的解决方案在下面(不能发布在这里,因为'迷你降价'格式)。 –

0
它显示为贴到该问题的完整解决方案

如下:

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

没有得到之前设置图像页面高度和宽度将返回整个原始图像的高度和宽度,如参考页面上的注释所示。

事实证明,如果您使用的是使用透明度的图像,解决方案会更容易;它只是单独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说不清楚为什么会发生这种情况。也许你可以回答这个问题,@丹纳克?

相关问题