Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 仅保留图像的红色/绿色/蓝色部分_Image_Image Processing_Language Agnostic - Fatal编程技术网

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

Image 仅保留图像的红色/绿色/蓝色部分,image,image-processing,language-agnostic,Image,Image Processing,Language Agnostic,我做了一个非常基本的算法,只提取图像的红/绿/蓝像素并显示它们。但是,它在某些图像上效果很好,在某些情况下会产生意外的结果。就像当我只想保持绿色时,它也会保持绿松石色 绿松石是一种绿色,但它不是我想要展示的。我只想要“视觉上”绿色的东西 下面是一个示例输出,显示了出现的问题: 该算法提取了狗坐的花盆的颜色 下面是我的算法(绿色的)。所有的算法都是相似的 void keepGreen() { for (int i = 0; // iterate over the pixels of the

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

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

下面是一个示例输出,显示了出现的问题:

该算法提取了狗坐的花盆的颜色

下面是我的算法(绿色的)。所有的算法都是相似的

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
}
void keepGreen(){
for(int i=0;//迭代图像的像素
i如果(输入分别提高红色和蓝色阈值,即
inputGreen*0.8
而不是
inputGreen*0.9
,请使用类似或的工具来验证您不想要的颜色中的RGB值,并将其作为反馈来设置阈值,以消除您不想要的颜色


你也可以考虑计算中的亮度水平。花盆上拾取的像素比花盆上的其他像素暗。

< P>因为蓝色小于绿色,并不意味着像素看起来不绿。例如,绿松石可能是红色的=50,蓝色的=200,绿色的=150。也许你需要(也)将本身具有大量绿色的像素灰显,而不考虑红色/蓝色。

您可以在此基础上展开更多内容吗?抓取一个绿松石像素,看看它是由什么组成的(RGB)。尝试添加规则,使其在绿色>阈值时变为灰色,而不考虑蓝色或红色。如果乘以更高的因子,则得到更多的阴影。在
keepBlue()的情况下,更高的因子效果很好
选择不同的色调。其他颜色会出错。这就是为什么我建议您乘以一个较低的因子。该因子对不同颜色的效果不同。想法是找到一种机制,使其对所有颜色都能始终如一地起作用:)没有这样的机制;你不想要的颜色是基于你自己的主观感受。你在花盆上所说的绿松石对我的眼睛来说仍然是绿色的阴影。也就是说,你不想要的像素比其他像素更暗。获取即时滴管或像素拾取工具,并沿着该区域的边缘运行它你不想要。我想你会找到一个你可以使用的模式。