着色灰度图像

时间:2012-01-13 10:58:03

标签: c# image-processing

我有一个灰度图像,需要用5种颜色的渐变值绘制。光像素应该从渐变中获得较浅的颜色,较暗的像素应该变得更暗。

如果渐变以黄色开始并以红色结束,则白色像素将为黄色,黑色像素为红色,其中一切都位于渐变之间。

可以用ColorMatrix完成吗?

3 个答案:

答案 0 :(得分:2)

您提到了“五种颜色”,但也提到了从红色到黄色的渐变。

为了说明基本思想,我们可以从字节数组生成一个Color数组,其中字节数组表示原始图像的8位灰度值。

  • 灰度值0(黑色)映射为红色,即Color.FromArgb(255,0,0)
  • 灰度值255(白色)映射为黄色,即Color.FromArgb(255,255,0)

要在给定灰度值(8位)的情况下找到新的渐变颜色(r,g,b),请执行以下操作:

  1. 将红色组件设置为255
  2. 将蓝色分量设置为原始灰度值(0 - 255)
  3. 将绿色组件设置为0
  4. 将字节数组转换为Color数组的示例代码:

    byte[] bytes = getImageBytes();
    Color[] colors = new Color[bytes.Length];  
    
    for(int i = 0; i < bytes.Length; i++)
    {
        colors[i] = Color.FromArgb(255, bytes[i], 0);
    }
    

    要快速执行此操作,请使用“锁定/解锁位”代码并直接操作字节值。

    http://msdn.microsoft.com/en-us/library/5ey6h79d.aspx

答案 1 :(得分:2)

你想要的是在最简单的情况下在3d中的5个点之间的线性插值。两种颜色{r1,g1,b1}和{r2,g2,b2}之间的直接颜色渐变,就像你将走到3d中连接点{r1,g1,b1}和{r2,g2, B2}。 当您的灰度值在区间[0,1]中时,如果您有灰度级0,则需要颜色为{r1,g1,b1},如果有灰度值,则需要{r2,g2,b2}灰度级1.问题是如何计算两者之间的颜色:

想想简单的学校矢量分析。 c1是点{r1,g1,b1},c2是{r2,g2,b2}。从c1开始,沿向量c2-c1的方向前进:

outColor = c1 + gray *(c2-c1)

或等效

outColor =(1-grey) c1 + grey c2

Remenber,灰色必须位于区间[0,1]。否则你必须重新缩放它。这是两点之间的简单线性插值,当然可以根据需要扩展为多种颜色。

对于五种颜色,方法基本相同。这里有5种随机选择的颜色:

{{0.273372, 0.112407, 0.0415183}, 
 {0.79436,  0.696305, 0.167884}, 
 {0.235083, 0.999163, 0.848291}, 
 {0.295492, 0.780062, 0.246481}, 
 {0.584883, 0.460118, 0.940826}}

enter image description here

你必须知道的两件重要事情:

  1. 如果您想获得给定灰度值的颜色,首先需要提取两个周围的rgb点。例如,如果你想得到灰色= 0.1的颜色,它将是第一个和第二个rgb点。

  2. 必须根据您在渐变中使用的颜色数量重新缩放灰度值。看看图像,有5种颜色,你有4个不同的两点插值间隔。如果要使上述颜色公式有效,则必须将每个颜色间隔的灰度值重新调整为[0,1]。

  3. 备注:这当然不是C#中实现的解决方案,但您的问题建议,创建相同大小的彩色图像不是您的问题。计算每个灰度值的颜色值是着色的关键。

答案 2 :(得分:0)

您可以简单地迭代灰度图像的所有像素并获取它的亮度和Alpha值(使用LINQ最简单)。然后你采用你想要的颜色,并使用它的色相和饱和度和亮度。

现在,您可以通过获取Gray.Alpha,Color.Hue,Color.Saturation以及Gray.Brightness和Color.Brightness的组合来创建新颜色,并将此颜色应用于灰度图像中的像素。

第一个棘手的部分是从Alpha,Hue,Saturation和Brigthness创建一种颜色,但你只需要this function ;-)

最后一个棘手的部分是将灰色和颜色的亮度结合起来,并留给读者练习。 ; - )