彩色图像的亮度和对比度

时间:2011-06-16 14:30:10

标签: vtk

有谁知道,我如何改变彩色图像的亮度和对比度。我知道vtkImageMapToWindowLevel,但在此类中设置图像的级别或窗口后,彩色图像变为灰度。

感谢您的回答;

1 个答案:

答案 0 :(得分:3)

根据定义,彩色图像已经进行了颜色映射,如果不进行分解和重组,则无法更改图像的亮度/对比度。

首先,以您想要的任何方式定义一对称为亮度和对比度的数字。通常,我将亮度作为最大值,对比度作为最小值和最大值之间的比率。类似地,如果要使用窗口/级别语义,“级别”是最小标量值,窗口是 最大值和最小值之间的差值。

接下来,您可以使用亮度和对比度找到标量范围 - 所需输出图像中的最小值和最大值。如果您正在应用亮度/对比度,则标量范围为:

  1. 最大=亮度
  2. 最小=最大/对比度
  3. 假设一个颜色查找表(LUT),其中一系列颜色处于不同的比例值,例如,在0到1的范围内。现在,由于我们知道亮度和对比度,我们可以设置较低的LUT值(范围0)映射到“最小”,上限值(范围1)映射到“最大”。完成此操作后,合适的类(如vtkImageMapToColors)可以获取单组件输入并将其映射到3或4组件图像。

    现在,所有这些只发生在单组件图像上,因为颜色LUT类(vtkScalarsToColors和相关类)仅在单组件图像上定义。

    如果你有权访问原始的单组件图像,并且你正在使用vtkImageMapToColors或类似的类,我建议在那个阶段处理它。

    如果你不这样做,我可以想到一种方式:

    1. 使用vtkImageExtractComponents将三个通道提取为三个不同的图像(您需要三个实例,每个实例都将原始图像作为输入)。
    2. 使用vtkImageShiftScale独立缩放3个通道(按亮度移动,按比例缩放)
    3. 使用vtkImageAppendComponents
    4. 将频道组合回来

      另一种可能性是使用vtkImageMagnitude,它将图像转换回灰度(通过将三个通道的大小放在一起),并使用vtkImageMapToColors和任何vtkScalarsToColors类重新应用颜色表作为查找表

      第一种方法更好,如果你的图像是真实的照片或类似的东西,其中颜色来自某个3分量源,如果你的输入图像已经使用了假色,那么第二种方法会更好(比如说一个红外摄像机,或一些程序生成的分形图像已被图像映射。)