当图像具有大量白平衡时提高对比度

信息处理 图像处理 opencv C#
2022-02-24 06:58:26

我有一张晚上拍的照片。

我将 _EqualizeHist 应用于它。但结果是图像中出现高水平的白度。

这是图像:

在此处输入图像描述

我以稍微不同的方式提出了这个问题,并获得了一个链接来改善图像的白平衡。

这是最初的问题

这是那个链接:

在此处输入链接描述

我在我的代码中已经做到了这一点,但现在我不知道下一步该做什么。如果有人可以建议下一步,我将不胜感激?

这是我的代码:

            Image<Bgr, byte> frame = new Image<Bgr, byte>(file);
            frame._EqualizeHist();
            Image<Hsv, byte> hsv = new Image<Hsv, byte>(file);
            Image<Gray,byte> maskLight= new Image<Gray,byte>(hsv.Width,hsv.Height);
            Image<Gray, byte> maskDark = new Image<Gray, byte>(hsv.Width, hsv.Height);

            Emgu.CV.CvInvoke.cvThreshold(hsv[2], maskLight, 128, 255, THRESH.CV_THRESH_BINARY);
            Emgu.CV.CvInvoke.cvThreshold(hsv[2], maskDark, 0, 127, THRESH.CV_THRESH_BINARY);

            Bgr bgrLightest;
            MCvScalar scalarLightest;
            frame.AvgSdv(out bgrLightest, out scalarLightest, maskLight);

            Bgr bgrDarkest;
            MCvScalar scalarDarkest;
            frame.AvgSdv(out bgrDarkest, out scalarDarkest, maskDark);

更新:我已尝试实施 sansuiso 提出的建议。

这是代码:

 Image<Bgr, byte> rgb = new Image<Bgr, byte>(@"D:\789.jpg");
            pictureBox1.Image = rgb.ToBitmap();

            for (int x = 0; x < 360; x = x + 24)
            {
                for (int y = 0; y < 288; y = y + 24)
                {
                    rgb.ROI = new Rectangle(0, 0, 360, 288);
                    int xx = x;
                    int yy = y;
                    if (x > 0)
                    {
                        xx = xx - 12;
                    }
                    if (y > 0)
                    {
                        yy = yy - 12;
                    }
                    rgb.ROI = new Rectangle(xx, yy, 24, 24); //360*288
                    rgb._EqualizeHist();
                }
            }
            rgb.ROI = new Rectangle(0, 0, 360, 288);
            pictureBox2.Image = rgb.ToBitmap();

这是生成的图像:

在此处输入图像描述

显然,我做的不对。谁能看看我的代码有没有错?

2个回答

直方图均衡化是一种全局操作,它可能导致某些区域受到不利影响,但代价是图像的其余部分看起来更好。考虑使用 Retinex 算法。它在改善局部和全局对比度增强方面非常有效。关于这个主题有很多论文,而且算法实现起来有点简单。最具挑战性的部分是参数的选择。

这是一份论文列表,这是一个非常有用的论文。

您可以对图像内的块执行直方图均衡化。重叠块(以及重叠区域中的结果平均)有助于减少后续块伪影。R. Szeliski 的书对这种局部均衡算法有一些解释。

另一种可能性是将中间的热点建模为一种高斯点,然后将最终结果作为原始图像和均衡图像之间的加权平均值输出。每个像素的权重应该由这个高斯点的值给出。这是一个粗略的模型,但在这里可能会产生有趣的结果。