2

画像の赤/緑/青のピクセルのみを抽出して表示する非常に基本的なアルゴリズムを作成しました。ただし、一部の画像ではうまく機能し、一部の画像では予期しない結果が生じます。緑だけ残したいときのように、ターコイズも残しておきます。

ターコイズは緑の色合いですが、表示したいものではありません. 「視覚的に」緑色のものだけが欲しい。

アルゴリズムは、犬が座っている
ここに画像の説明を入力
植木鉢のターコイズ色を検出しました。元画像はこちら

私のアルゴリズムは以下のとおりです (緑色のもの)。すべてのアルゴリズムは互いに似ています。

void keepGreen() {
  for (int i = 0;  // iterate over the pixels of the image
  i < img.pixels.length;
  i++) {
    float inputRed = red(img.pixels[i]); // extract red
    float inputGreen = green(img.pixels[i]); // extract green
    float inputBlue = blue(img.pixels[i]); // extract blue

    int pixel = -1;

    float outputRed = -1;
    float outputGreen = -1;
    float outputBlue = -1;

    if(inputRed <= inputGreen*0.9 && inputBlue <= inputGreen*0.9){ // check if the pixel is visually green
      outputRed = inputRed; // yes, let it stay
      outputGreen = inputGreen;
      outputBlue = inputBlue;
    }else{ // no, make it gray
      int mostProminent =(int) max(inputRed, inputGreen, inputBlue);
      int leastProminent =(int) min(inputRed, inputGreen, inputBlue);
      int avg = (int) ((mostProminent + leastProminent) / 2);
      outputRed = avg;
      outputGreen = avg;
      outputBlue = avg;
      pixel = color(avg, avg, avg);
    }
    img.pixels[i] = color(outputRed, outputGreen, outputBlue); // set the pixel to the new value
  }
  img.updatePixels(); // update the image
  image(img, WIDTH/2, HEIGHT/2, calculatedWidth, calculatedHeight); // display
}

これらのエラーを回避するにはどうすればよいですか?

4

2 に答える 2

1

赤と青のしきい値を個別に上げてみてください。つまり、Instant EyedropperPixel Picker などのツールinputGreen * 0.8を使用して、不要な色の RGB 値を確認し、それをフィードバックとして使用して、色を除去するためのしきい値を設定します。いらない色。inputGreen * 0.9

計算で輝度レベルを考慮することもできます。植木鉢でピックアップされているピクセルは、植木鉢の他のピクセルよりも暗いです。

于 2013-07-18T19:09:31.230 に答える
1

青が緑よりも小さいからといって、ピクセルが緑に見えないわけではありません。たとえば、ターコイズは赤 = 50、青 = 200、緑 = 150 です。おそらく、赤/青に関係なく、それ自体にかなりの緑があるピクセルを (また) グレーアウトする必要があります。

于 2013-07-18T19:10:10.517 に答える