2

画像の特定のピクセルを見つける必要があります。「89 21 24」としましょう。

ネストされた 2 つのサイクルを使用して画像を移動しています。

for( $y=$inity; $y<$h; $y++) {
 for( $x=$initx; $x<$w; $x++) {

   $pixel = getpixelat($img,$x,$y);
   if ($pixel == "892124" and getpixelat($img,$x+1,$y) == "1212224") {
       $px = $x; $py = $y;
       break 2;
   }
}

$y と $x を 1 つずつではなく、たとえば 4 ごとに増やして、アルゴリズムを高速化したいと考えています (16 倍高速ですか?) もちろん、4x4 の正方形を構築するピクセルを正確に知る必要があります。

私はそれを次のようにします:

    if ($pixel == "" and nextpixel...) {
        $px = $x - 1; $py = $y -...;
    }
   //etc.

それを達成するためのよりスマートな方法はありますか?

編集:

getpixelat 関数は次のとおりです。

function getpixelat($img,$x,$y) {
$rgb = imagecolorat($img,$x,$y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
return $r.$g.$b;
}
4

2 に答える 2

1

1.) ネストされたループを避ける:

2.) pixle の古い値を保存します (関数の呼び出しはそれほど高速ではありません)。

3.) 色を文字列に変換しない/文字列を比較しない! (1212224 とは何ですか? Hex-Color ではありません)

$px=-1;
$py=-1;

$lineW = ($w-$initx);
$lineH = ($h-$inity);
$count = $lineW * $lineH;

$color1 =hexdec ("892124") ;
$color2 =hexdec ("1212224") ;

$x=$initx;
$y=$inity;
$new = imagecolorat($img,$x,$y);

while(true) {
  $x++;
  if ($x>=$w) {
    $x=$initx+1;
    $y++;
    if ($y>=$h) break;
    $new = imagecolorat($img,$x-1,$y);
  }
  $old = $new;
  $new = imagecolorat($img,$x,$y);

  if ($old == $color1 && $new == $color2)
  {
    $px = $x; $py = $y;
    break;
  }
}

(コードはテストされていません:-))

于 2012-07-26T14:08:43.053 に答える
1

探している色が少なくとも 2x2、または 3x3、または任意の固定サイズのパッチに常に表示されることがわかっている場合は、反復ごとにインクリメント$x$yて 1 以上ずつルックアップを高速化できます。

たとえば、パッチのサイズが常に少なくともKxLであることがわかっている場合は、次の操作を実行できます。

for( $y=$inity; $y<$h; $y += L) {
    for( $x=$initx; $x<$w; $x += K) {
        $pixel = getpixelat($img,$x,$y);

        if ($pixel == "892124" and getpixelat($img,$x+1,$y) == "1212224") {
            $px = $x; $py = $y;
            break 2;
        }
   }
}
于 2012-07-26T13:51:17.670 に答える