原理:
- 不均匀光照补偿:由于光照条件的变化,图像的某些区域可能会比其他区域更亮或更暗。这种不均匀的光照会影响图像分析和视觉效果。不均匀光照补偿算法通过计算图像中每个局部区域的亮度,并与整体亮度进行比较,从而调整每个区域的亮度,使得整个图像的亮度更加均匀。
- 子块处理:通过将图像分割成多个子块,并分别计算每个子块的平均亮度,可以更精细地调整每个区域的亮度。这种方法可以更好地处理局部的光照变化。
- 亮度差值:通过计算每个子块与整体图像亮度的差值,可以确定每个子块需要增加或减少多少亮度,以达到整体的均匀性。
这个算法在处理由于光照不均匀导致的图像质量问题时非常有用,例如在监控摄像头、卫星图像处理等领域。
这段代码是一个用于图像处理的Python脚本,它使用OpenCV库来实现不均匀光照补偿算法。该算法的目的是在图像处理中修正由于光照不均匀造成的亮度差异,使得图像的视觉效果更加均匀。以下是代码的详细流程和原理:
-
函数定义:
uneven_light_compensate
函数接受一个图像和一个可选的block_size
参数。
-
灰度转换:
- 如果输入图像是彩色的(即具有三个通道),则将其转换为灰度图像。这一步是必要的,因为算法基于灰度值来计算亮度。
-
计算平均灰度值:
- 计算整个图像的平均灰度值。这个值将作为后续计算的基准。
-
计算新的行列数:
- 根据
block_size
计算图像被分割成多少个子块。block_size
决定了每个子块的大小。
- 根据
-
初始化子块亮度矩阵:
- 创建一个与子块数量相同大小的矩阵
block_image
,用于存储每个子块的平均灰度值。
- 创建一个与子块数量相同大小的矩阵
-
遍历子块:
- 遍历每个子块,计算每个子块内的平均灰度值。对于每个子块:
- 确定子块的边界。
- 提取子块区域(
image_roi
)。 - 计算该区域的平均灰度值,并存储在
block_image
中。
- 遍历每个子块,计算每个子块内的平均灰度值。对于每个子块:
-
计算子块的亮度差值矩阵:
- 将每个子块的平均灰度值减去整个图像的平均灰度值,得到亮度差值。
-
调整差值矩阵大小:
- 将亮度差值矩阵的大小调整为与原图像相同,使用双三次插值方法。
-
计算矫正后的图像:
- 将原图像转换为浮点数类型,以便进行精确的数学运算。
- 从原图像中减去调整后的亮度差值矩阵,得到补偿后的图像。
- 使用
np.clip
函数将像素值限制在0到255之间,确保像素值的有效性。 - 将结果转换回无符号8位整型。
-
读取图像:
- 使用
cv2.imread
函数读取图像。
- 使用
-
应用不均匀光照补偿算法:
- 调用
uneven_light_compensate
函数,传入读取的图像,得到补偿后的图像。
- 调用
-
显示结果:
- 使用
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改写
- 使用