程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

图像处理——饱和度调整算法(python语言)

发布于2019-08-22 16:16     阅读(5164)     评论(0)     点赞(28)     收藏(3)


饱和度调整算法说明(完整python代码在文末):

本算法主要是利用HSL颜色空间进行饱和度S的上下限控制,对RGB空间进行补丁式调整。调整过程在RGB空间进行,其原理简单地说就是判断每个像素的R、G、B值是否大于或小于平均值,大于加上调整值,小于则减去调整值,如何计算各个像素点的调整系数是关键。本算法主体思想就是利用HSL来计算各点的调整系数。

算法过程如下:

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

1. 首先将RGB空间图像转换为HSL空间,用来对饱和度S进行上下限控制,这里不考虑色相H差异。

转换公式如下:

            

           

其中L表示亮度,S表示饱和度,min和max代表RGB空间中的R、G、B颜色值中的最小最大值,范围均为0-1的实数。

          

设置饱和度增量increment,范围为-1至1,并由此计算出适用于RGB空间的调整系数进行饱和度调整。

 

这里分两种情况:

1) 当增量i (increment) >= 0时,此时饱和度采用指数型增长方式调整。考虑到当前饱和度s与增量i之和可能大于1,超出饱和度上限,故仅仅考虑i作为调整依据不妥。在此选定当i+s大于1时,取s补数作为调整依据(s补数越大,调整越大);当i+s小于1,取i作为调整依据(i越大,调整越大)。RGB空间的调整系数alpha公式如下:

          

    其中s代表当前饱和度,i代表设置的饱和度增量(increment)。

          

2) 当增量i (increment) < 0时,此时饱和度采用线性减弱方式调整。考虑到当i取-1时,R、G、B值会相等,可以直接采用线性的方式作调整。RGB空间的调整系数alpha如下:

            

         

 

3. 将饱和度调整过的RGB进行校验,即小于0的取0,大于1的取1。

          

4. 将饱和度调整完毕的RGB图输出比较即可。

 

完整python代码如下:

运行方式:打开终端界面,在该py文件目录下,运行:python  该文件.py  图片路径  饱和等级(-1~1)

例如:python  Saturation.py  C:\Users\PDD\Desktop\pdd.jpg  0.5

  1. import cv2
  2. import sys
  3. import numpy as np
  4. import matplotlib.pyplot as plt
  5. """
  6. PS算法
  7. 主要是利用HSL颜色空间进行饱和度S和亮度L的上下限控制,对RGB空间进行补丁式调整。
  8. 参考CSDN博客:https://blog.csdn.net/maozefa/article/details/1781208
  9. """
  10. def PSAlgorithm(rgb_img, increment):
  11. img = rgb_img * 1.0
  12. img_min = img.min(axis=2)
  13. img_max = img.max(axis=2)
  14. img_out = img
  15. #获取HSL空间的饱和度和亮度
  16. delta = (img_max - img_min) / 255.0
  17. value = (img_max + img_min) / 255.0
  18. L = value/2.0
  19. # s = L<0.5 ? s1 : s2
  20. mask_1 = L < 0.5
  21. s1 = delta/(value)
  22. s2 = delta/(2 - value)
  23. s = s1 * mask_1 + s2 * (1 - mask_1)
  24. # 增量大于0,饱和度指数增强
  25. if increment >= 0 :
  26. # alpha = increment+s > 1 ? alpha_1 : alpha_2
  27. temp = increment + s
  28. mask_2 = temp > 1
  29. alpha_1 = s
  30. alpha_2 = s * 0 + 1 - increment
  31. alpha = alpha_1 * mask_2 + alpha_2 * (1 - mask_2)
  32. alpha = 1/alpha -1
  33. img_out[:, :, 0] = img[:, :, 0] + (img[:, :, 0] - L * 255.0) * alpha
  34. img_out[:, :, 1] = img[:, :, 1] + (img[:, :, 1] - L * 255.0) * alpha
  35. img_out[:, :, 2] = img[:, :, 2] + (img[:, :, 2] - L * 255.0) * alpha
  36. # 增量小于0,饱和度线性衰减
  37. else:
  38. alpha = increment
  39. img_out[:, :, 0] = img[:, :, 0] + (img[:, :, 0] - L * 255.0) * alpha
  40. img_out[:, :, 1] = img[:, :, 1] + (img[:, :, 1] - L * 255.0) * alpha
  41. img_out[:, :, 2] = img[:, :, 2] + (img[:, :, 2] - L * 255.0) * alpha
  42. img_out = img_out/255.0
  43. # RGB颜色上下限处理(小于0取0,大于1取1)
  44. mask_3 = img_out < 0
  45. mask_4 = img_out > 1
  46. img_out = img_out * (1-mask_3)
  47. img_out = img_out * (1-mask_4) + mask_4
  48. return img_out
  49. path = './resource/fruit.bmp'
  50. increment = 0.5 # 范围-1到1
  51. # run : python Saturation.py (path) (increment)
  52. if __name__ == "__main__":
  53. len = len(sys.argv)
  54. if len >= 2 :
  55. path = sys.argv[1]
  56. if len >= 3 :
  57. increment = float(sys.argv[2])
  58. img = cv2.imread(path)
  59. img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
  60. img_new = PSAlgorithm(img, increment)
  61. plt.figure("img_original")
  62. plt.imshow(img/255.0)
  63. plt.axis('off')
  64. plt.figure("img_saturate")
  65. plt.imshow(img_new)
  66. plt.axis('off')
  67. plt.show()

 



所属网站分类: 技术文章 > 博客

作者:齐天大圣

链接:https://www.pythonheidong.com/blog/article/52843/d1ed4b4d7ac3f90fc4c6/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

28 0
收藏该文
已收藏

评论内容:(最多支持255个字符)