PHP - 快速循环图像像素
Posted
技术标签:
【中文标题】PHP - 快速循环图像像素【英文标题】:PHP - Quickly Loop Through Image Pixels 【发布时间】:2017-08-01 11:07:49 【问题描述】:下午好 SO 社区,
我一直在从事一个需要光学字符识别的项目。我试图保持项目的轻便和便携,因此安装第三方程序将不是这里的选项。
无论如何,我决定用 php 编写自己的 OCR,但它在图像中循环的速度非常慢。我目前正在这样做的方式是两个嵌套的 for 循环。我正在尝试遍历给定的图像(在这种情况下,图像是 PNG。263x55 像素),并将 rgba 写入文本文件。 (格式:'rgba(0, 0, 0, 0)')。 alpha 在 0 到 127 之间,因为它使用的是 PHP。
我的代码可以运行,但速度很慢,而且图像确实没有那么大。你能想出什么方法可以加快速度吗?
提前致谢,
提姆
<?php
// To prevent the script from timing out
ini_set('max_execution_time', 0);
If (isset($_GET["Image"]))
$pImage = $_GET["Image"];
Else
$pImage = "1";
parseImage($pImage);
// END TEST SYSTEM
Function parseImage($ImgNum)
Echo "Parsing Image $ImgNum";
$logFile = "Image$ImgNum.txt";
$fHandle = fopen($logFile, "w");
If ($ImgNum != 1 AND $ImgNum != 2 AND $ImgNum != 3 AND $ImgNum != 4 AND $ImgNum != 5 AND $ImgNum != 6)
Echo "Error: Image number is invalid.";
Exit();
// Start Optical Character Recognition
$Image = "https://www.example.com/img/Image$ImgNum.png";
$size = getimagesize($Image);
$width = $size[0];
$height = $size[1];
$ctrH = 0;
$ctrW = 0;
for($x=1;$x<=$width;$x++)
for($y=1;$y<=$height;$y++)
$pixel = getPixel($Image, $x, $y);
fwrite($fHandle, $pixel . "\n");
$ctrH ++;
$ctrW ++;
fclose($fHandle);
Echo "Analyzing <a href='$Image'>$Image</a><br />";
Echo $ctrW . "px wide<br />";
Echo ($ctrH / $ctrW) . "px tall<br />";
function getPixel($image, $x, $y)
// Echo "<br />Reading $image. X: $x - Y: $y<br />";
$im = imagecreatefrompng($image);
$rgb = imagecolorat($im, $x, $y);
$colors = imagecolorsforindex($im, $rgb);
$r = $colors["red"];
$g = $colors["green"];
$b = $colors["blue"];
$a = $colors["alpha"];
$print = "Pixel (" . $x . "x" . $y . "): rgba($r, $g, $b, $a)";
return $print;
?>
【问题讨论】:
仅供参考,我认为您编写自己的 OCR 代码很棒。 @nfnneil 谢谢哈哈! 尝试自己的 OCR 的疯狂道具。将 imagecreatefrompng 移到函数之外和嵌套循环之外。我看到每个像素查找在内存中创建该图像作为开销城市。做一次并传递它。 @SymeonQuimby 首先,谢谢!其次,让这个超级快的神圣废话。请以答案的形式重做,这样我就可以接受了,哈哈。 【参考方案1】:您的问题是,每次通过在 getPixel 函数中添加 imagecreatefrompng
来查找像素值时,您都会创建图像。将它移到 getPixel 函数和嵌套循环之外,然后将其传入。
通过这种方式,您不必承担将图像分解到内存中、查找像素、然后在函数退出时让垃圾收集器销毁该工作的开销,而只是在下一个像素重新执行此操作。
【讨论】:
很棒的答案。这加快了脚本的速度。与其花费将近 20 分钟的时间来运行,不如说只需要几秒钟,哈哈。有道理哈哈。以上是关于PHP - 快速循环图像像素的主要内容,如果未能解决你的问题,请参考以下文章