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

尝试单独提高红色和蓝色阈值,即inputGreen * 0.8不要inputGreen * 0.9 使用Instant EyedropperPixel Picker之类的工具来验证您不想要的那些颜色的 RGB 值,并将其用作反馈来设置阈值以消除你不想要的颜色。

您可能还想在计算中考虑亮度级别。花盆上被拾取的像素比花盆上的其他像素要暗。

于 2013-07-18T19:09:31.230 回答
1

仅仅因为蓝色小于绿色并不意味着像素看起来不是绿色的。例如,绿松石可能是红色=50、蓝色=200、绿色=150。也许您需要(也)将本身具有大量绿色的像素变灰,无论红色/蓝色如何。

于 2013-07-18T19:10:10.517 回答