我正在尝试识别图像中彩色矩形的宽度。对于图像处理我正在使用Imagick for PHP。
我的想法是将图像转换为txt并使用正则表达式搜索此txt,以获取具有特定颜色的所有像素(#00FF00)。
以下是txt的外观示例(从第0列第83行开始摘录):
0,83: (255,255,255,1) #FFFFFF graya(255,1)
1,83: (255,255,255,1) #FFFFFF graya(255,1)
2,83: (255,255,255,1) #FFFFFF graya(255,1)
3,83: (0,255,0,1) #00FF00 graya(0,1)
4,83: (0,255,0,1) #00FF00 graya(0,1)
5,83: (0,255,0,1) #00FF00 graya(0,1)
6,83: (255,255,255,1) #FFFFFF graya(255,1)
7,83: (255,255,255,1) #FFFFFF graya(255,1)
8,83: (255,255,255,1) #FFFFFF graya(255,1)
0,84: (255,255,255,1) #FFFFFF graya(255,1)
1,84: (255,255,255,1) #FFFFFF graya(255,1)
2,84: (255,255,255,1) #FFFFFF graya(255,1)
3,84: (0,255,0,1) #00FF00 graya(0,1)
4,84: (0,255,0,1) #00FF00 graya(0,1)
5,84: (0,255,0,1) #00FF00 graya(0,1)
....
这是我的代码:
$canvasImg = new Imagick("_sources/passepartout/". $deviceName .".png");
$canvasImg->setFormat(txt);
preg_match_all("/(\\d+),(\\d+): \\(0,255,0,1\\)/is", $canvasImg, $colorMatchAll);
$firstPixelX = reset($colorMatch[1]);
$lastPixelX = end($colorMatch[1]);
$canvasWidth = $lastPixelX - $firstPixelX;
到目前为止这个工作正常,但它非常慢,因为它找到了彩色矩形中的所有像素,包括y轴的整个高度。
现在因为我只对这个#00FF00矩形的宽度感兴趣,我认为如果正则表达式只找到#00FF00的第一个像素然后通过像素行直到结束(第83行),它会更快我的例子)并在它碰到第84行时停止。
我可以对我的正则表达式进行修改吗?它可以完成我正在寻找的内容吗?
答案 0 :(得分:0)
你可以使用$ imagick-> trimImage()然后使用$ imagick-> getImagePage()来获取位置,如果矩形是图像上唯一的东西,或者你可以迭代像素,并且你自己的边缘检测。
$imagick = new \Imagick(realpath($imagePath));
$imageIterator = $imagick->getPixelRegionIterator(0, 0,
$imagick->getImageWidth(),
$imagick->getImageHeight(),
);
/* Loop through pixel rows */
foreach ($imageIterator as $pixels) {
/** @var $pixel \ImagickPixel */
/* Loop through the pixels in the row (columns) */
foreach ($pixels as $column => $pixel) {
$red = $pixel->getColorValue(\Imagick::COLOR_RED);
$green = $pixel->getColorValue(\Imagick::COLOR_GREEN);
$blue = $pixel->getColorValue(\Imagick::COLOR_BLUE);
//Do detection here
}
/* Sync the iterator, this is important to do on each iteration */
$imageIterator->syncIterator();
}
$imageIterator->clear();