opencvsharp的亮度均衡处理问题

opencvsharp对图像进行亮度补偿效果和预想效果不一致什么原因

public Mat unevenLightCompensation(Mat img,PictureBox pb,int blocksize)
        {
            Mat temp = img.Clone();
            double avg_pixel = Cv2.Mean(temp)[0];
            int block_rows = (int)Math.Ceiling((double)img.Rows / blocksize);
            int block_cols = (int)Math.Ceiling((double)img.Cols / blocksize);
            Mat new_img = new Mat(new Size(block_rows, block_cols), MatType.CV_32FC1,new Scalar(0));
            for (int i = 0; i < block_rows; i++)
            {
                for (int j = 0; j < block_cols; j++)
                {
                    int left = j * blocksize;
                    int right = (j + 1) * blocksize > temp.Cols ? temp.Cols : (j + 1) * blocksize;
                    int up = i * blocksize;
                    int down = (i + 1) * blocksize > temp.Rows ? temp.Rows : (i + 1) * blocksize;
                    Mat roi = temp[new OpenCvSharp.Range(up, down), new OpenCvSharp.Range(left, right)];
                    double roi_avg = Cv2.Mean(roi)[0];
                    new_img.Set(i, j, roi_avg);
                }
            }
            new_img = new_img -  avg_pixel;
            Mat new_img2=new Mat();
            Cv2.Resize(new_img, new_img2, temp.Size(), 0, 0, InterpolationFlags.Cubic);
            new_img2.ConvertTo(new_img2, MatType.CV_8UC1);
            Mat new_src = new Mat();
            temp.ConvertTo(new_src, MatType.CV_32FC1);
            Mat dst = new_src - new_img2;
            dst.ConvertTo(dst, MatType.CV_8UC1);
            pb.Image = BitmapConverter.ToBitmap(dst);
            return dst;
        }

处理完后的图像为一片黑色,亮度补偿完全没有效果

想要找出问题出现详细解释及处理方案

在给出的代码中,可以看到使用了类似的方法来实现亮度补偿。使用了一个 blocksize 参数来控制小块的大小,然后在图像中分割出若干个小块,计算每个小块的平均亮度,并将这些平均亮度存储在一个新的矩阵中。最后,将这个新矩阵与原图的平均亮度的差值计算出来,然后将这个差值应用到原图中,实现亮度补偿。

但是在调用 Cv2.Resize 函数时,将 new_img 矩阵的大小缩放到了原图的大小,而在调用 new_img.ConvertTo 函数时,将 new_img 矩阵转换为了 8 位无符号字节型。但是在计算差值时,将原图转换为了 32 位浮点型。这可能导致在计算差值时出现问题。

具体来说,由于将 new_img 矩阵转换为了 8 位无符号字节型,因此它的值范围是 0255,而在将原图转换为 32 位浮点型时,其值范围是 -3.4028235e+383.4028235e+38。这意味着如果原图的像素值大于 255,则在计算差值时会出现问题,因为 new_img 矩阵中的像素值都小于等于 255。

因此可能的解决方案是,在计算差值时使用同样的数据类型,例如将原图也转换为 8 位无符号字节型,或者将 new_img 矩阵转换为 32 位浮点型。另外也可以考虑使用其他的插值方法来缩放 new_img 矩阵,例如使用双线性插值或三次卷积插值。

尝试下不均匀光照的补偿方法,其主要思路为:
1、求取源图I的平均灰度,并记录rows和cols;
2、按照一定大小,分为N*M个方块,求出每块的平均值,得到子块的亮度矩阵D;
3、用矩阵D的每个元素减去源图的平均灰度,得到子块的亮度差值矩阵E;
4、用双立方差值法,将矩阵E差值成与源图一样大小的亮度分布矩阵R;
5、得到矫正后的图像result=I-R;

OpenCVSharp 中的亮度均衡功能可以通过调整图像的亮度和对比度来改善图像质量。但是,如果效果和预想效果不一致,可能是因为以下几种原因:

1.图像本身的亮度和对比度不够。如果图像本身的亮度和对比度就很低,即使进行亮度均衡处理也可能无法改善图像质量。
2.亮度均衡参数设置不当。亮度均衡处理的参数可能会影响处理的效果,如果参数设置不当,可能会导致效果和预想效果不一致。
3.图像本身存在许多噪点或污渍。如果图像中存在大量噪点或污渍,亮度均衡处理可能无法有效改善图像质量。
4.图像过于复杂。如果图像中存在大量细节,亮度均衡处理可能会改变图像的对比度,导致效果和预想效果不一致。

但是补偿后的图像变成了黑色。这可能是因为补偿的效果不正常,导致图像的亮度变得比原来更低。

首先,你可以检查一下代码中的变量是否被正确赋值。例如,avg_pixel 是否被正确计算,block_rows 和 block_cols 是否正确计算。

其次,你可以尝试在进行矩阵运算之前将图像转换为浮点类型,并在计算完成后再将图像转换回 8 位无符号整型,这可能会改善图像的质量。

如果这些操作都不能解决问题,你可以尝试打印出每一步的中间结果,以便更好地理解代码的执行流程,并找出问题所在。