【问题标题】:Keeping only the red/green/blue part of the image只保留图像的红/绿/蓝部分
【发布时间】:2013-07-17 21:34:44
【问题描述】:

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

绿松石是一种绿色,但这不是我想要展示的。我只想要“视觉上”绿色的东西。

这是一个示例输出,显示出了什么问题:

该算法拾取了狗坐的花盆的绿松石色。 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
}

如何避免这些错误?

【问题讨论】:

    标签: image image-processing language-agnostic


    【解决方案1】:

    分别提高红色和蓝色阈值的实验,即inputGreen * 0.8 而不是inputGreen * 0.9 使用Instant EyedropperPixel Picker 之类的工具来验证您不想要的那些颜色的RGB 值,然后使用作为反馈设置消除您不想要的颜色的阈值。

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

    【讨论】:

    • 如果我乘以一个更高的系数,我会得到更多的阴影。在keepBlue() 的情况下,较高的系数可以很好地拾取各种色调。它在别人身上搞砸了。
    • 这就是为什么我建议你乘以一个较低的因子。
    • 该因子对不同颜色的作用不同。我们的想法是找到一种对所有颜色都有效的机制:)
    • 没有这样的机制;您不想要的颜色是基于您自己的主观感知。你所说的那个花盆上的绿松石在我眼里仍然是一片绿色。也就是说,您不想要的像素比其他像素
    • 获取即时吸管或像素选择器工具,然后沿着您不想要的区域边缘运行它。我想你会找到一个可以使用的模式。
    【解决方案2】:

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

    【讨论】:

    • 你能详细介绍一下吗?
    • 抓取一个绿松石像素,看看它是由什么组成的 (RGB)。如果绿色 > THRESHOLD,无论是蓝色还是红色,尝试添加一条规则使其变为灰色。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-20
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    相关资源
    最近更新 更多