我有一個函數,給定一個具有透明背景和未知對象的圖像,找到對象的頂部,左側,右側和底部邊界。目的是讓我可以在對象的邊界周圍畫一個盒子。我不是想要檢測物體的實際邊緣 - 只是最上方,最下方等。如何優化此圖像「邊緣檢測」算法?
我的功能運行良好,但速度很慢,因爲它掃描圖像中的每個像素。
我的問題是:是否有一種更快,更有效的方法來檢測圖像中使用庫存PHP/GD功能的最上方,最左側,最右側和最底部的不透明像素?
有一個影響選項的問題:圖像中的對象可能具有透明部分。例如,如果它是一個非填充形狀的圖像。
public static function getObjectBoundaries($image)
{
// this code looks for the first non white/transparent pixel
// from the top, left, right and bottom
$imageInfo = array();
$imageInfo['width'] = imagesx($image);
$imageInfo['height'] = imagesy($image);
$imageInfo['topBoundary'] = $imageInfo['height'];
$imageInfo['bottomBoundary'] = 0;
$imageInfo['leftBoundary'] = $imageInfo['width'];
$imageInfo['rightBoundary'] = 0;
for ($x = 0; $x <= $imageInfo['width'] - 1; $x++) {
for ($y = 0; $y <= $imageInfo['height'] - 1; $y++) {
$pixelColor = imagecolorat($image, $x, $y);
if ($pixelColor != 2130706432) { // if not white/transparent
$imageInfo['topBoundary'] = min($y, $imageInfo['topBoundary']);
$imageInfo['bottomBoundary'] = max($y, $imageInfo['bottomBoundary']);
$imageInfo['leftBoundary'] = min($x, $imageInfo['leftBoundary']);
$imageInfo['rightBoundary'] = max($x, $imageInfo['rightBoundary']);
}
}
}
return $imageInfo;
}
一些非常有趣的答案,值得一些適當的測試。我會在第二天左右做一些基準測試,並接受性能最好的測試。 – mmatos