色调,饱和度,亮度和对比度之间的关系

时间:2014-03-20 14:00:57

标签: c# image-processing emgucv

我有一个C#桌面应用程序。

我正在使用emgu框架进行图像处理。

我要做的是改善'洗出'的图像,使它们更有活力。

使用myImage._EqualHist()可以正常工作,当图片有丰富的颜色(如白天)时,但是在夜间白色平衡会在应用emgu过滤器后扭曲,我得到一个非常明亮的/忙碌的夜间形象。如果我能调整对比度那么好 - 我想。

我找到了一些可以调整对比度的代码。我现在正试图找出我应该使用什么值来调整对比度。显然,这个值会在24小时的循环中发生变化。

我已经对我可用于自动对比图像的关系/公式进行了第一次尝试。 显然,我在猜测和尝试。不是很科学//数学,我正在网上搜索我可以应用的逻辑。

我还应该考虑图像的灰度系数吗?

到目前为止,这是我的代码:

           Image<Bgr, Byte> imgColor = new Image<Bgr, byte>(@"d:\20140320022038047.jpg");
            Image<Hsv,Byte> hsv = new Image<Hsv,byte>(imgColor.ToBitmap());
            double averageHue = hsv[0].GetAverage().Intensity;
            double averageSat = hsv[1].GetAverage().Intensity;
            double averageLum = hsv[2].GetAverage().Intensity;

            //I am guessing here and playing around with the constants
            float adjustContrastBy =(float)( averageLum / averageHue);

            byte[, ,] data = imgColor.Data;
            //this part of the code enumertaes through the Image byte array
            for (int y = 0; y < imgColor.Height ; y++)
            {
                for (int x = 0; x < imgColor.Width; x++)
                {
                    byte B = data[y, x, 0];
                    byte G = data[y, x, 1];
                    byte R = data[y, x, 2];

                    float Red = R / 255.0f;
                    float Green = G / 255.0f;
                    float Blue = B / 255.0f;
                    Red = (((Red - 0.5f) * adjustContrastBy) + 0.5f) * 255.0f;
                    Green = (((Green - 0.5f) * adjustContrastBy) + 0.5f) * 255.0f;
                    Blue = (((Blue - 0.5f) * adjustContrastBy) + 0.5f) * 255.0f;

                    int iR = (int)Red;
                    iR = iR > 255 ? 255 : iR;
                    iR = iR < 0 ? 0 : iR;
                    int iG = (int)Green;
                    iG = iG > 255 ? 255 : iG;
                    iG = iG < 0 ? 0 : iG;
                    int iB = (int)Blue;
                    iB = iB > 255 ? 255 : iB;
                    iB = iB < 0 ? 0 : iB;

                    data[y, x, 0] = (byte)iB;
                    data[y, x, 1] = (byte)iG;
                    data[y, x, 2] = (byte)iR;
                }
            }
            pictureBox1.Image = imgColor.ToBitmap();

我也使用这种方法调整伽玛:

double intensity = grayCurrent.GetAverage().Intensity;
double g = Math.Log(Shared.Optimum / 255) / Math.Log(intensity / 255);
grayCurrent._GammaCorrect(g);

这当然有助于我进行动作检测,但我希望我现在专注于改善用户'看到'而不是计算机检测到的内容。

0 个答案:

没有答案