我做了一个非常基本的算法,它只提取图像的红色/绿色/蓝色像素并显示它们。然而,它在某些图像上效果很好,并在某些图像上产生意想不到的结果。就像当我只想保留绿色时,它也保留绿松石色。
绿松石是一种绿色阴影,但它不是我想要显示的颜色。我只想要“视觉上”绿色的东西。
这是一个示例输出,显示出了什么问题:
该算法选取了狗所坐的花盆的绿松石色。 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
}
如何避免这些错误?
最佳答案
尝试分别提高红色和蓝色阈值,即 inputGreen * 0.8
而不是 inputGreen * 0.9
使用类似 Instant Eyedropper 的工具或Pixel Picker验证您不需要的颜色中的 RGB 值,并将其用作反馈来设置消除您不需要的颜色的阈值。
您可能还想在计算中考虑亮度级别。花盆上拾取的像素比花盆上的其他像素更暗。
关于image - 仅保留图像的红/绿/蓝部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17731858/