我正在开发一个过滤器来处理图像。将此滤镜应用于图像后,我得到一些大于 255 或小于 0 的 RGB 值。我可以将这些像素分别饱和到 255 和 0,但是图像不好。
我想找到一种方法来规范化像素直方图,因此在规范化之后,RGB 的值介于 0,255 之间。
代码如下:
double max = outputPixel.Cast<double>().Max();
double targetMax = 300;
double min = outputPixel.Cast<double>().Min();
double targetMin = -50;
for (int c = 0; c < 3; c++)
{
for (int i = 0; i < outputPixel.GetLength(0); i++)
{
for (int j = 0; j < outputPixel.GetLength(1); j++)
{
outputPixel[i, j, c] = wb[c] * (((outputPixel[i, j, c] - min) * (targetMax-targetMin) / (max - min))+targetMin);
outputPixel[i, j, c] = Saturate(outputPixel[i, j, c]);
}
}
}
}
outputPixel 定义为
private static double[, ,] outputPixel;
并初始化如下:
outputPixel = new double[inputImage.Width, inputImage.Height, 3];
问题是:
如果我不进行直方图归一化,那么在黑暗区域会有很多斑点型噪声,并且大部分图像都会被漂白。
如果我使用直方图归一化,那么我可以在白色区域(主要是云区域)上看到红色。
一种解决方案是标准化 HSB 中的直方图,但我不能对 HSB 使用内部 C# 计算,因为 RGB 的值大于(或小于)255 (0)。
我可以在 C# 中做什么?