A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

亮度调整算法说明(完整python代码在文末):
  本算法的基本原理就是对像素点统一进行加上或减去某个调整值,已达到亮度的增强或减弱。包括基于RGB空间R、G、B值的调整和基于HSV空间V值的调整。

  (参考CSDN博客:https://blog.csdn.net/maozefa/article/details/4493395

1. 基于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)。



2. 基于HSV空间亮度调整算法:
  主要是对HSV空间的亮度V值进行调整。计算出调整系数后,调整手段主要也有两种:

    1) 基于当前V值大小进行调整,即V值越大,调整的越大,例如:当前像素点V值为200,调整系数1.1,则调整后为220;

    2) 不考虑V值大小的影响,即始终对各个V值进行相同的调整, 例如:当前像素点V值为200,调整系数10/255,则调整后为210。



完整python代码如下:
运行方式:打开终端界面,在该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()



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马