2017-03-10 69 views
0

下午好SO社区,PHP - 快速通过图像像素

我一直在致力于一个项目,要求一些光学字符识别。我正在努力保持项目的轻便性和便携性,因此安装第三方程序不会成为一种选择。

无论如何,我决定在PHP中编写自己的OCR,但它通过图像循环极其缓慢。我现在正在做的方式是两个嵌套for循环。我试图循环播放给定的图像(在这种情况下,图像是PNG,263x55像素),并将rgba写入文本文件。 (格式:'rgba(0,0,0,0)')。因为它使用PHP,因此alpha在0和127之间。

我的代码有效,但速度很慢,图像真的不是那么大。你能想出任何可以加快速度的方法吗?

由于提前,

<?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; 
} 
?> 
+1

只是一个fyi,我认为你编码自己的OCR真棒。 – Neil

+0

@nfnneil谢谢哈哈! –

+0

疯狂的道具尝试你自己的OCR。将imagecreatefrompng移出您的函数以外并嵌套循环之外。我看到在内存中创建每个像素查找作为开销城市的图像。做一次并传递它。 –

回答

1

你的问题是,你正在创建每次通过具有imagecreatefrompng您getPixel函数中查找一个像素的值时的图像。把它移到你的getPixel函数和嵌套循环之外,然后传递它。

这样你就不会将图像爆炸到内存中,查找一个像素,然后在函数退出时让垃圾收集器销毁该工作,而只是再次完成下一个像素。

+0

梦幻般的答案。这通过TON加速了剧本。它只需要几分钟的时间就可以完成,而不需要花费将近20分钟的时间。有意义哈哈。 –