3

画像内で最も暗いピクセルを見つけるにはどうすればよいですか?だから私が他のピクセルよりも多く見ることができる最も暗いピクセルを見つけるために。ここで私は私の画像ノイズに基づいており、それを白い色で着色していますが、最も暗いピクセルを見つける方法は?私はrgb配列要素で魔女の発生が最大であることを見つけようとしましたが、それで私は白いピクセルを見つけました。これが私のコードの一部です:

<?php

    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.35) return false;
      }
      return true;
    }

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

        $n = $imagedata[0];
        $m = $imagedata[1];
        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 ($k = 0; $k < $n; $k++)
        {
            for ($l = 0; $l < $m; $l++)
            {
                for ($i = 0; $i < $n; $i++)
                {
                    for ($j = 0; $j < $m; $j++)
                    {
                        if (($i+1 == $n) && ($j+1 == $m))
                        {
                            continue;
                        }
                        else
                        {
                            if ($j+1 == $m and $rgb[$i][$j] > $rgb[$i+1][0])
                            {
                                $t = $rgb[$i][$j];
                                $rgb[$i][$j] = $rgb[$i+1][0];
                                $rgb[$i+1][0] = $t;
                            }
                            else
                            {
                                if ($rgb[$i][$j] > $rgb[$i][$j+1])
                                {
                                    $t = $rgb[$i][$j];
                                    $rgb[$i][$j] = $rgb[$i][$j+1];
                                    $rgb[$i][$j+1] = $t;
                                }
                            }
                        }
                    }
                }
            }
        }*/



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

                    imagesetpixel($im, $i, $j, 16777215);
                    cropCentered($im,20,20);
                }                  

            }
        }

        return $im;
    }

    function cropCentered($img, $w, $h)
    {
      $cx = $img->getWidth() / 2;
      $cy = $img->getHeight() / 2;
      $x = $cx - $w / 2;
      $y = $cy - $h / 2;
      if ($x < 0) $x = 0;
      if ($y < 0) $y = 0;
      return $img->crop(0, 0, $w, $h);
    }

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

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




    imagejpeg($img,null, 100);

    ?>
4

2 に答える 2

4

あなたがしたいのは、最も暗い色を保存する変数を設定することです。

次に、各ピクセルをループして、そのピクセルが最も暗い色(最も暗い色変数に格納されている)よりも暗いかどうかをテストします。

ピクセルが暗い場合は、最も暗い色と同じに設定します。

このように、最も暗い色は、ある場合にのみ/常に暗い色で上書きされます。

$pixels = array(/*put colors that correspond to pixels here*/)
$darkest = $pixels[0];
for($i=0; $i<$count($pixels); $i++){
    if($pixels[$i] is darker than $darkest){ //you will have to figure out how to do that part
        $darkest = $pixels[$i];
    }
}
于 2012-07-12T14:25:49.323 に答える
0

RGBとは異なるカラーモデルを使用する必要があります。この場合、「明度」コンポーネントが含まれているため、HSLが役立ちます。このコンポーネントに基づいて、ある色が別の色より明るいか暗いかを判断できます。RGBをHSLに変換する方法はいくつかありますが、ウィキペディアの記事で説明されている方法を使用しました(HSLの「bi-hexcone」モデルを参照)。

<?php

// Returns whether c2 is darker than c1
function isDarker($c1, $c2) {
  // Find L (lightness) component in a HSL model
  $max1 = max($c1);
  $min1 = min($c1);
  $l1 = ($max1 + $min1) / 2;
  $max2 = max($c2);
  $min2 = min($c2);
  $l2 = ($max2 + $min2) / 2;

  // Compare colors based on L component (lower means darker)
  return $l2 < $l1;
}

// Assuming colors are stored in a 2-dimensional $rgb array
$rowCount = count($rgb);
$colCount = count($rgb[0]);
$darkest = $rgb[0][0];
for ($i = 0; $i < $rowCount; $i++) {
  for ($j = 0; $j < $colCount; $j++) {
    if (isDarker($darkest, $rgb[$i][$j])) {
      $darkest = $rgb[$i][$j];
      // Optionally you can save the indices $i and $j
    }
  }
}
于 2012-07-13T04:26:07.160 に答える