画像処理——輝度調整アルゴリズム(python言語)

4472 ワード

輝度調整アルゴリズムの説明(完全なpythonコードは文末):
  このアルゴリズムの基本的な原理は、ピクセルポイントの統一を加算するか、または調整値を減算することで、輝度の増強または弱さに到達しました.RGB空間R、G、B値に基づく調整とHSV空間V値に基づく調整を含む.
  (CSDNブログ参照:https://blog.csdn.net/maozefa/article/details/4493395)
1.RGBの空間輝度調整アルゴリズムに基づく:
  主にRGB空間に対して輝度調整を行う.調整係数を算出した後、調整手段は主に2つあります.
    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値を調整する.調整係数を算出した後、調整手段は主に2つあります.
    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\p.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()