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 - 快速循环图像像素的主要内容,如果未能解决你的问题,请参考以下文章

缩小php中的图像以快速查看并保持质量[关闭]

Android SDK 的快速位图模糊

C++:OpenCV:快速像素迭代

如何从颜色字典中快速更改图像中的像素?

二进制图像上的快速像素计数 - ARM neon 内在函数 - iOS 开发

OpenCV入门快速学会OpenCV5图像处理基础像素处理