JAYLEE900 2022-12-26 20:00 采纳率: 37.5%
浏览 49
已结题

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;
        }

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

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

  • 写回答

4条回答 默认 最新

  • |__WhoAmI__| 2022-12-26 20:26
    关注

    在给出的代码中,可以看到使用了类似的方法来实现亮度补偿。使用了一个 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月3日
  • 创建了问题 12月26日

悬赏问题

  • ¥15 c#如何使用scottplot给已画好的自定义热度图,增加一个一定的colorbar
  • ¥15 信贷平台.用户信用评估和风险评估怎么做,希望来个做过的Java.有合作的机会
  • ¥15 IMageEN获得图形顶点坐标的问题
  • ¥50 软件PC客户端抓包,获取http请求和响应
  • ¥15 手机被安装黑客软件怎么办?
  • ¥15 Windows C++ PaddleOcr 中文模型的训练方法
  • ¥15 c# 用scottplot画 以时间为纵坐标,数值为横坐标画曲线图
  • ¥15 手机应用程序安装异常
  • ¥15 grbl的G92修改MPos的问题。
  • ¥15 vue2中,Ant Design Pro s-table中,使用服务端排序怎么做