opencv 一种不均匀光照的补偿方法(python代码)

原理

  • 不均匀光照补偿:由于光照条件的变化,图像的某些区域可能会比其他区域更亮或更暗。这种不均匀的光照会影响图像分析和视觉效果。不均匀光照补偿算法通过计算图像中每个局部区域的亮度,并与整体亮度进行比较,从而调整每个区域的亮度,使得整个图像的亮度更加均匀。
  • 子块处理:通过将图像分割成多个子块,并分别计算每个子块的平均亮度,可以更精细地调整每个区域的亮度。这种方法可以更好地处理局部的光照变化。
  • 亮度差值:通过计算每个子块与整体图像亮度的差值,可以确定每个子块需要增加或减少多少亮度,以达到整体的均匀性。

这个算法在处理由于光照不均匀导致的图像质量问题时非常有用,例如在监控摄像头、卫星图像处理等领域。

这段代码是一个用于图像处理的Python脚本,它使用OpenCV库来实现不均匀光照补偿算法。该算法的目的是在图像处理中修正由于光照不均匀造成的亮度差异,使得图像的视觉效果更加均匀。以下是代码的详细流程和原理:

  1. 函数定义

    • uneven_light_compensate函数接受一个图像和一个可选的block_size参数。
  2. 灰度转换

    • 如果输入图像是彩色的(即具有三个通道),则将其转换为灰度图像。这一步是必要的,因为算法基于灰度值来计算亮度。
  3. 计算平均灰度值

    • 计算整个图像的平均灰度值。这个值将作为后续计算的基准。
  4. 计算新的行列数

    • 根据block_size计算图像被分割成多少个子块。block_size决定了每个子块的大小。
  5. 初始化子块亮度矩阵

    • 创建一个与子块数量相同大小的矩阵block_image,用于存储每个子块的平均灰度值。
  6. 遍历子块

    • 遍历每个子块,计算每个子块内的平均灰度值。对于每个子块:
      • 确定子块的边界。
      • 提取子块区域(image_roi)。
      • 计算该区域的平均灰度值,并存储在block_image中。
  7. 计算子块的亮度差值矩阵

    • 将每个子块的平均灰度值减去整个图像的平均灰度值,得到亮度差值。
  8. 调整差值矩阵大小

    • 将亮度差值矩阵的大小调整为与原图像相同,使用双三次插值方法。
  9. 计算矫正后的图像

    • 将原图像转换为浮点数类型,以便进行精确的数学运算。
    • 从原图像中减去调整后的亮度差值矩阵,得到补偿后的图像。
    • 使用np.clip函数将像素值限制在0到255之间,确保像素值的有效性。
    • 将结果转换回无符号8位整型。
  10. 读取图像

    • 使用cv2.imread函数读取图像。
  11. 应用不均匀光照补偿算法

    • 调用uneven_light_compensate函数,传入读取的图像,得到补偿后的图像。
  12. 显示结果

    • 使用cv2.imshow函数显示原始图像和补偿后的图像。
    • cv2.waitKey(0)使得窗口持续打开,直到用户按下任意键。
    • cv2.destroyAllWindows()关闭所有OpenCV创建的窗口。
       
      import cv2
      import numpy as np
      
      def uneven_light_compensate(image, block_size=32):
          # 将图像转换为灰度图
          if len(image.shape) == 3:
              image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
          
          # 计算图像的平均灰度值
          average = np.mean(image)
          
          # 计算新的行列数
          rows_new = int(np.ceil(image.shape[0] / block_size))
          cols_new = int(np.ceil(image.shape[1] / block_size))
          
          # 初始化子块亮度矩阵
          block_image = np.zeros((rows_new, cols_new), dtype=np.float32)
          
          # 遍历子块并计算每个子块的平均灰度值
          for i in range(rows_new):
              for j in range(cols_new):
                  row_min = i * block_size
                  row_max = min((i + 1) * block_size, image.shape[0])
                  col_min = j * block_size
                  col_max = min((j + 1) * block_size, image.shape[1])
                  
                  image_roi = image[row_min:row_max, col_min:col_max]
                  temaver = np.mean(image_roi)
                  block_image[i, j] = temaver
          
          # 计算子块的亮度差值矩阵
          block_image = block_image - average
          
          # 将差值矩阵差值成与原图一样大小的亮度分布矩阵
          block_image_resized = cv2.resize(block_image, (image.shape[1], image.shape[0]), interpolation=cv2.INTER_CUBIC)
          
          # 计算矫正后的图像
          image_float = image.astype(np.float32)
          dst = image_float - block_image_resized
          dst = np.clip(dst, 0, 255)  # 限制像素值在0-255之间
          dst = dst.astype(np.uint8)
          
          return dst
      
      # 读取图像
      image = cv2.imread('图像路径')
      
      # 应用不均匀光照补偿算法
      compensated_image = uneven_light_compensate(image)
      
      # 显示结果
      cv2.imshow('Original Image', image)
      cv2.imshow('Compensated Image', compensated_image)
      cv2.waitKey(0)
      cv2.destroyAllWindows()
       
      
       


      图像与思路来源于徐大大平凡之路,我整理并用python改写

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值