我有一个图像的像素颜色我想要改变以匹配特定的颜色(虽然不完全)。
作为一个例子,我想为红色汽车的图像着色,使其呈现蓝色。我可以使用GIMP和ImageMagick来做到这一点,但是我想知道他们使用哪种算法来实现这一点,所以我可以在我自己的程序中实现它。
我试图通过简单地添加颜色之间的区别来做到这一点,但它不能很好地工作。
答案 0 :(得分:3)
对于那些刚刚进入图像处理的人来说,这是一个未经考验的建议......也许你可以只扩展频道?
例如:
RGB_Pixel.r = RGB_Pixel.r * 0.75;
RGB_Pixel.g = RGB_Pixel.g * 0.75;
RGB_Pixel.b = RGB_Pixel.b * 1.25;
如果您使用这三个更改逐个像素地循环浏览图像,我希望您看到图像向蓝色方向移动,并且当然可以试错这些数字。
编辑: 现在,如果您只想改变某些颜色的像素颜色,比如说,您想要将蓝色汽车变为红色而不对图片的其余部分做任何事情,则需要对每个颜色进行检查。像素看它看起来是什么颜色。一种方法是使用欧几里德距离:
int* R = RGB_Pixel.r;
int* G = RGB_Pixel.g;
int* B = RGB_Pixel.b;
// You are looking for Blue, which is [0 0 255];
// this variable D is the distance of your current pixel from the desired color.
float D = sqrt( (R-0)*(R-0) + (G-0)*(G-0) + (B-255)*(B-255) );
if(D < threshold)
{
R = R * 0.75;
G = G * 0.75;
B = B * 1.25;
}
阈值变量是介于1和255之间的数字,表示颜色与您要查找的颜色的最大距离,并且仍被视为“足够接近”。这是因为您不想只查找[0 0 255],很少会在图像中找到完美的蓝色(或完美的任何东西)。
您希望使用可以逃脱的最低阈值,这样您就不会为其他不属于您正在寻找的对象的东西着色,但是您希望确保您的阈值很高足以覆盖整个图像。一种方法是设置多个D变量,每个变量具有不同的目标颜色,因此您可以捕获几种不同类型的“蓝色”而不使用非常高的阈值。例如,对于人眼来说,[102 102 200]看起来像蓝色,但如果[0 0 255]是您的目标颜色,可能需要相当高的阈值才能捕获。
我建议您使用this计算器来了解您想要专门搜索的颜色。