本算法的基本原理就是对像素点统一进行加上或减去某个调整值,已达到亮度的增强或减弱。包括基于RGB空间R、G、B值的调整和基于HSV空间V值的调整。
(参考CSDN博客:https://blog.csdn.net/maozefa/article/details/4493395)
主要是对RGB空间进行亮度调整。计算出调整系数后,调整手段主要有两种:
1) 基于当前RGB值大小进行调整,即R、G、B值越大,调整的越大, 例如:当前像素点为(100,200,50),调整系数1.1,则调整后为(110,220,55);
2) 不考虑RGB值大小的影响,即始终对各个点R、G、B值进行相同的调整,例如:当前像素点为(100,200,50),调整系数10/255,则调整后为(110,210,60)。
主要是对HSV空间的亮度V值进行调整。计算出调整系数后,调整手段主要也有两种:
1) 基于当前V值大小进行调整,即V值越大,调整的越大,例如:当前像素点V值为200,调整系数1.1,则调整后为220;
2) 不考虑V值大小的影响,即始终对各个V值进行相同的调整, 例如:当前像素点V值为200,调整系数10/255,则调整后为210。
运行方式:打开终端界面,在该py文件目录下,
运行:python 该文件.py 图片路径 亮度等级(-1~1) 调整方式(0或1,默认1)
例如:python Lightness.py C:\Users\PDD\Desktop\pdd.jpg 0.3 (1)
import cv2
import sys
import numpy as np
import matplotlib.pyplot as plt
"""
基于RGB空间亮度调整算法:
主要是对RGB空间进行亮度调整。计算出调整系数后,调整手段主要有两种:
1) 基于当前RGB值大小进行调整,即R、G、B值越大,调整的越大,
例如:当前像素点为(100,200,50),调整系数1.1,则调整后为(110,220,55);
2) 不考虑RGB值大小的影响,即始终对各个点R、G、B值进行相同的调整,
例如:当前像素点为(100,200,50),调整系数10/255,则调整后为(110,210,60)。
"""
def RGBAlgorithm(rgb_img, value=0.5, basedOnCurrentValue=True):
img = rgb_img * 1.0
img_out = img
# 基于当前RGB进行调整(RGB*alpha)
if basedOnCurrentValue:
# 增量大于0,指数调整
if value >= 0 :
alpha = 1 - value
alpha = 1/alpha
# 增量小于0,线性调整
else:
alpha = value + 1
img_out[:, :, 0] = img[:, :, 0] * alpha
img_out[:, :, 1] = img[:, :, 1] * alpha
img_out[:, :, 2] = img[:, :, 2] * alpha
# 独立于当前RGB进行调整(RGB+alpha*255)
else:
alpha = value
img_out[:, :, 0] = img[:, :, 0] + 255.0 * alpha
img_out[:, :, 1] = img[:, :, 1] + 255.0 * alpha
img_out[:, :, 2] = img[:, :, 2] + 255.0 * alpha
img_out = img_out/255.0
# RGB颜色上下限处理(小于0取0,大于1取1)
mask_3 = img_out < 0
mask_4 = img_out > 1
img_out = img_out * (1-mask_3)
img_out = img_out * (1-mask_4) + mask_4
return img_out
"""
基于HSV空间亮度调整算法:
主要是对HSV空间的亮度V值进行调整。计算出调整系数后,调整手段主要有两种:
1) 基于当前V值大小进行调整,即V值越大,调整的越大,
例如:当前像素点V值为200,调整系数1.1,则调整后为220;
2) 不考虑V值大小的影响,即始终对各个V值进行相同的调整,
例如:当前像素点V值为200,调整系数10/255,则调整后为210。
"""
def HSVAlgorithm(rgb_img, value=0.5, basedOnCurrentValue=True):
hsv_img = cv2.cvtColor(rgb_img, cv2.COLOR_RGB2HSV)
img = hsv_img * 1.0
img_out = img
# 基于当前亮度进行调整(V*alpha)
if basedOnCurrentValue:
# 增量大于0,指数调整
if value >= 0 :
alpha = 1 - value
alpha = 1/alpha
# 增量小于0,线性调整
else:
alpha = value + 1
img_out[:, :, 2] = img[:, :, 2] * alpha
else :
alpha = value
img_out[:, :, 2] = img[:, :, 2] + 255.0 * alpha
# HSV亮度上下限处理(小于0取0,大于1取1)
img_out = img_out/255.0
mask_1 = img_out < 0
mask_2 = img_out > 1
img_out = img_out * (1-mask_1)
img_out = img_out * (1-mask_2) + mask_2
img_out = img_out * 255.0
# HSV转RGB
img_out = np.round(img_out).astype(np.uint8)
img_out = cv2.cvtColor(img_out, cv2.COLOR_HSV2RGB)
img_out = img_out/255.0
return img_out
path = './resource/fruit.bmp'
value = 0.3 # 范围-1至1
basedOnCurrentValue = True # 0或者1
# run : python Lightness.py (path) (value) (basedOnCurrentValue)
if __name__ == "__main__":
len = len(sys.argv)
if len >= 2 :
path = sys.argv[1]
if len >= 3 :
value = float(sys.argv[2])
if len >= 4 :
basedOnCurrentValue = bool(int(sys.argv[3]))
img = cv2.imread(path)
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
img_rgb = RGBAlgorithm(img, value, basedOnCurrentValue)
img_hsv = HSVAlgorithm(img, value, basedOnCurrentValue)
plt.figure("img_original")
plt.imshow(img/255.0)
plt.axis('off')
plt.figure("img_light_rgb")
plt.imshow(img_rgb)
plt.axis('off')
plt.figure("img_light_hsv")
plt.imshow(img_hsv)
plt.axis('off')
plt.show()