一,简介:
图像色温是描述图像色彩偏暖或偏冷的一种方式,它通常与实际光源的色温相对应。在摄影和图像处理中,色温通常以开尔文(Kelvin)为单位来表示。较低的色温值(例如2700K)通常与暖色光(如蜡烛光或黄昏时的光)相对应,而较高的色温值(例如5500K或更高)通常与冷色光(如白炽灯或中午的日光)相对应。
在图像处理中,色温调整可以用来改变图像的整体色调,使其看起来更暖或更冷。例如,将图像的色温调低(添加蓝色)可以使其看起来更冷,而将色温调高(添加黄色)可以使其看起来更暖。这种调整可以用来补偿图像在拍摄时可能存在的色温偏差,或者仅仅是为了创造特定的视觉效果。
在OpenCV中,色温调整可以通过创建一个查找表(LUT)来实现,该表将原始颜色值映射到新的颜色值。这个过程通常涉及到对RGB颜色空间的操作,以及对每个通道的独立调整。通过这种方式,可以实现平滑且自然的色温变化,而不会导致颜色过限或失真。
二,算法实现:
本项目通过以下流程实现图像色温的调整:首先生成一个查找表,用于将原始像素值映射到新的像素值,并进行范围限制;接着,将这个查找表应用到图像的各个颜色通道上,以改变颜色;然后,根据输入参数确定色温调整的强度,并创建三个不同的查找表分别应用于红色和绿色通道以增加亮度,以及蓝色通道以减少亮度,从而模拟色温的变化;最后,通过这些调整,图像的整体色调被改变,实现了快速且有效的色温调整效果。
实现代码:
import cv2
import numpy as np
def create_lut(level):
# 创建一个查找表(LUT),范围从0到255
lut = np.arange(256, dtype=np.uint8)
# 更复杂的颜色映射,这里使用简单的线性映射作为示例
# 实际上,可以在这里使用更复杂的非线性映射
for i in range(256):
if i + level > 255:
lut[i] = 255
elif i + level < 0:
lut[i] = 0
else:
lut[i] = i + level
return lut
def apply_lut(image, lut):
# 使用OpenCV的LUT函数应用查找表
return cv2.LUT(image, lut)
def color_temperature(input, n):
result = input.copy()
level = n // 2
# 创建查找表并应用它到RGB通道
lut_r = create_lut(level)
lut_g = create_lut(level)
lut_b = create_lut(-level)
result[:, :, 2] = apply_lut(result[:, :, 2], lut_r) # R通道
result[:, :, 1] = apply_lut(result[:, :, 1], lut_g) # G通道
result[:, :, 0] = apply_lut(result[:, :, 0], lut_b) # B通道
return result
if __name__ == "__main__":
src = cv2.imread(r"F:\traditional_vison\2.jpg")
n1 = 50
n2 = -50
# 应用色温调整
result1 = color_temperature(src, n1)
result2 = color_temperature(src, n2)
cv2.imshow("original", src)
cv2.imshow("result1", result1)
cv2.imshow("result2", result2)
cv2.waitKey(0)
cv2.destroyAllWindows()
三,效果:
原图:
暖色图:
冷色图: