2017-03-10 10 views
0

午後SOコミュニティ、PHP - イメージピクセルを素早くループする

私はいくつかの光学式文字認識を必要とするプロジェクトに取り組んできました。私はプロジェクトを軽く持ち運びできるようにしているので、サードパーティ製のプログラムをインストールすることはオプションではありません。

とにかく、私は自分のOCRをPHPで書くことにしましたが、イメージを非常に遅くループします。私が現在やっているのは、2つのネストされたループです。私は与えられたイメージをループしようとしています(この場合、イメージはPNG、263x55ピクセルです)、rgbaをテキストファイルに書き込みます。 (形式: 'rgba(0、0、0、0)')。 PHPを使用しているため、アルファは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

私は自分のOCRをコーディングするのに素晴らしいと思います。 – Neil

+0

@nfnneilありがとう、ハハ! –

+0

あなた自身のOCRを試してみるための不道徳な小道具。関数の外側とネストされたループの外側にimagecreatefrompngを移動します。私はオーバーヘッド都市としてすべてのピクセル検索をメモリ内に作成することを見ています。それを一度やり、それを回しなさい。 –

答えて

1

あなたの問題は、あなたがイメージあなたはgetPixelメソッド関数内imagecreatefrompngを持つことにより、ピクセルの値を検索するたびに作成しているということです。これをgetPixel関数とネストされたループの外に移動し、代わりにそれを渡します。

このようにして、画像をメモリに展開し、ピクセルをルックアップしてから、関数が終了するとガベージコレクタによって破壊され、次のピクセルだけが再び処理されます。

+0

すばらしい答え。これはTONによってスクリプトをスピードアップしました。走るのに20分ほどかかっているのではなく、ほんの数秒しかかかりません。理にかなっている。 –

関連する問題