python語言之影像處理:亮度調整演算法

ckxllf發表於2019-08-29

  亮度調整演算法說明(完整python程式碼在文末):

  本演算法的基本原理就是對畫素點統一進行加上或減去某個調整值,已達到亮度的增強或減弱。包括基於RGB空間R、G、B值的調整和基於HSV空間V值的調整。

  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()


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945560/viewspace-2655410/,如需轉載,請註明出處,否則將追究法律責任。

相關文章