我正在开发一个处理图像的过滤器。将此滤镜应用于图像后,我得到一些大于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#中做些什么?