ITPub博客

首页 > 应用开发 > Python > python语言之图像处理:亮度调整算法

python语言之图像处理:亮度调整算法

原创 Python 作者:ckxllf 时间:2019-08-29 14:58:48 0 删除 编辑

  亮度调整算法说明(完整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。

  """     无锡妇科医院排行 http://www.0510bhyy.com/

  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博客 ” ,链接:https://blog.itpub.net/69945560/viewspace-2655410/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-08-16

  • 博文量
    204
  • 访问量
    262647