首页 文章

仅保留图像的红/绿/蓝部分

提问于
浏览
2

我做了一个非常基本的算法,它只提取图像的红/绿/蓝像素并显示它们 . 但是,它在某些图像上运行良好,并在某些图像中产生意外结果 . 就像我想保持绿色一样,它也保持绿松石 .

绿松石是绿色的阴影,但它不是我想要展示的 . 我只想要“视觉上”绿色的东西 .

这是一个示例输出,显示出错的地方:

enter image description here

该算法选择了狗坐在其上的花盆的turquoiose颜色 . The original image is here .

我的算法在下面(对于绿色算法 . )所有的算法都是相似的 .

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
}

How can I avoid those errors ?

2 回答

  • 1

    尝试单独提高红色和蓝色阈值,即 inputGreen * 0.8 而不是 inputGreen * 0.9 使用像Instant EyedropperPixel Picker这样的工具来验证那些你不想要的颜色的RGB值 .

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

  • 1

    仅仅因为蓝色小于绿色并不意味着像素看起来不是绿色 . 例如,绿松石可能是红色= 50,蓝色= 200,绿色= 150 . 也许你需要(也)灰显自己右边有大量绿色的像素,无论红/蓝 .

相关问题