我想在许多照明条件下获取图像的RGB值。为了获得某种中立的场景,我想使用一些预定义图像的 RGB 值规范化 RGB 值。
让我解释一下。我有 6 个预定义的图像,我知道它们的确切平均 RGB 值。现在我将在不同的照明条件下拍摄未知图像的照片。我还将在相同条件下拍摄预定义的 6 张图像的照片。现在,我的目标是通过将预定义图像的已知参考 rgb 值与从相机图像计算的值进行比较来定义规范化公式。使用此归一化参数,我将校准未知图片的 RGB 值。这样我就可以以中性的方式从未知图片中获取平均RGB值,而不管照明条件如何。
我怎样才能在 Java 中轻松实现这一点。
您这样做是为了真正规范化 RGB 的原因,还是您试图规范化图像以具有相似的亮度。 因为如果您的目标只是亮度,那么我会转换为具有亮度分量的颜色标准,并仅规范化亮度分量。
从那里,您可以以不同的颜色分量标准获取新图像,并根据需要转换回RGB。
步骤(但不是在 java 中):
1) Convert - RGBImage --> YUVImage
2) Normalize RGBImage using the Y component
3) Convert - Normalized(YUVImage) --> Normalized(RGBImage)
通过这种方式,您可以使用此处描述的算法对亮度实现归一化。
否则,您可以平均每个通道的平均值,并将其用作新图像的归一化因子的分子,分别计算每个通道。
对于不同的照明情况,只需要线性RGB校正。只需将每个 R,G,B 值乘以为每个通道派生的常数即可。
如果只有一种参考颜色,那很容易 - 乘以参考颜色,然后除以捕获的颜色。例如,如果您的参考颜色是 (240,200,120),但您的图像测量值为 (250,190,150) - 您将红色乘以 240/250,绿色乘以 200/190,蓝色乘以 120/150。对图像中的每个像素使用相同的常量。
对于要匹配的多种颜色,您必须平均校正因子以得出一组常量。需要对更亮的颜色给予更大的权重,例如,如果你有一个参考(200,150,20)并且它测量了(190,140,10),你会试图将蓝色的数量加倍,这可能很远。最简单的方法是将所有参考值相加并除以测量值的总和。