0

ここでは画像を確認しようとしていますが、別の色の「楕円」がいくつかあり、自分の色で滑らかにしようとしています。しかし、私のコードは特定の色のみを検索します。たとえば、5%の違いが悪いと彼に言うにはどうすればよいでしょうか。私のピクセルの近くですべて同じピクセルを見つけて、それらを別の色で着色するにはどうすればよいですか?

<?php
function LoadJpeg($imgname)
{
    $count = 0;
    /* Attempt to open */
    $im = @imagecreatefrompng($imgname);
    $imagedata = getimagesize($imgname);


    for($i=0; $i<$imagedata[0]; $i++){
        for($j=0; $j<$imagedata[1]; $j++){
            $rgb[$i][$j] = imagecolorat($im, $i, $j);
            //echo $rgb[$i][$j];
            //echo "<br>";
        }
    }
    for($i=0; $i<$imagedata[0]-5; $i++){
        for($j=0; $j<$imagedata[1]-5; $j++){
            if (($rgb[$i][$j] == $rgb[$i+3][$j]) || ($rgb[$i][$j] == $rgb[$i][$j+3]))
            {
                #echo "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa";
                $count = $count + 1;
                //echo "<br> <br>";
                //echo $count;
                //$red = imagecolorallocate($im, 255, 255, 255);
                imagesetpixel($im, $i, $j, 13437229);
            }


        }
    }
    return $im;
}



header('Content-Type: image/jpeg');

$img = LoadJpeg('1.png');


// echo "Image width  is: " . $imagedata[0];
// echo "Image height is: " . $imagedata[1];

imagejpeg($img,null, 100);

?>

主な問題は強い==ですが、この色の違いは私の場合はキャッチする必要があります。

4

1 に答える 1

1

各色成分間の距離を計算するのはどうですか?コンポーネントの1つが5%を超えて異なる場合は、falseを返します。

// Returns RGB components of the color represented by an integer
function components($color) {
  return array(($color >> 16) & 0xFF, ($color >> 8) & 0xFF, $color & 0xFF);
}

// Performs "similarity test" of 2 colors
function isSimilar($color1, $color2) {
  $c1 = components($color1);
  $c2 = components($color2);
  for ($i = 0; $i < 3; $i++) {
    $k = ($c1[$i] > $c2[$i]) ? ($c1[$i] - $c2[$i]) / $c2[$i] : ($c2[$i] - $c1[$i]) / $c1[$i];
    if ($k > 0.05) return false;
  }
  return true;
}

// ...
if (isSimilar($rgb[$i][$j], $rgb[$i][$j + 3]) or isSimilar($rgb[$i][$j], $rgb[$i + 3][$j])) {
  // ...
}

コードには追加のテストと調整が必要な場合がありますが、アイデアはあると思います。

于 2012-07-07T17:04:35.777 に答える