2011-09-07 97 views
2

我有一个图像,其像素颜色我想改变以匹配特定颜色(尽管不完全)。图像着色算法

作为一个例子,我想给一辆红色汽车的图像着色,使它看起来是蓝色的。我可以用GIMP和ImageMagick做到这一点,但我想知道他们使用哪种算法来做到这一点,以便我可以在自己的程序中实现它。

我试图做到这一点与简单的颜色之间的差异,但它不工作得很好。

+0

我认为GIMP将图像转换为HSV并调整每个像素的'v'分量。这是我的猜测,因为我不知道它是如何工作的。 – Blender

+1

你使用什么颜色的模特?如果你在RGB空间,我不知道该怎么做。如果您使用[HSV或其任何变体](http://en.wikipedia.org/wiki/HSL_and_HSV),它实际上只是一个加法(模MAX_VALUE)。 (当然,你可以转换RGB和HSV/HSL/HSB/...) – nobody

+0

@Blender我认为它实际上改变了色调而不是价值。 –

回答

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; 

如果您遍历图像逐像素与三个转变,我希望你能看到对蓝色图像移位,当然数目可试error'd。

编辑: 现在,如果您只想改变某个特定颜色的像素的颜色开始,比方说,您希望将一辆蓝色汽车变为红色而不对图片的其余部分执行任何操作,需要对每个像素运行一次检查,看看它看起来是什么颜色。这样做的一个方法是使用欧几里得距离:

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计算器,以获得你想要搜索的颜色具体的感觉。

+0

另外,不要忘记放置一些东西来防止你的新蓝元素超过255(或者你使用的任何限制)。 – Andrew

+0

这似乎在某种程度上工作,不知道如何从RGB值得到这​​些比例... –

+0

你是什么意思,“从RGB值得到这​​些尺度”?我不确定你的目标是什么,你想缩放整个图像还是只是图像中的对象?如果您想要更改图像内某种特定颜色的颜色,则需要进行一些颜色检测,我可以帮助您,因为这正是我在当前项目中处理的内容。 – Andrew