小言_互联网的博客

Python 图像处理实战 | 图像的灰度非线性变换之对数变换、伽马变换

361人阅读  评论(0)

作者 | 杨秀璋

来源 | CSDN博客

责编 | 夕颜

头图 | 付费下载自视觉中国

出品 | CSDN(ID:CSDNnews)

本篇文章主要讲解非线性变换,使用自定义方法对图像进行灰度化处理,包括对数变换和伽马变换。本文主要讲解灰度线性变换,基础性知识希望对你有所帮助。

1.图像灰度非线性变换:DB=DA×DA/255
2.图像灰度对数变换
3.图像灰度伽玛变换

图像灰度非线性变换:DB=DA×DA/255

图像的灰度非线性变换主要包括对数变换、幂次变换、指数变换、分段函数变换,通过非线性关系对图像进行灰度处理,下面主要讲解三种常见类型的灰度非线性变换。

原始图像的灰度值按照DB=DA×DA/255的公式进行非线性变换,其代码如下:


   
  1. 1# -*- coding: utf -8 -*-
  2. 2import cv2  
  3. 3import numpy as np  
  4. 4import matplotlib.pyplot as plt
  5. 5
  6. 6#读取原始图像
  7. 7img = cv2.imread( 'miao.png')
  8. 8
  9. 9#图像灰度转换
  10. 10grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  11. 11
  12. 12#获取图像高度和宽度
  13. 13height = grayImage.shape[ 0]
  14. 14width = grayImage.shape[ 1]
  15. 15
  16. 16#创建一幅图像
  17. 17result = np.zeros((height, width), np. uint8)
  18. 18
  19. 19#图像灰度非线性变换:DB=DA×DA/ 255
  20. 20for i in  range(height):
  21. 21     for j in  range(width):
  22. 22        gray =  int(grayImage[i,j])* int(grayImage[i,j]) /  255
  23. 23        result[i,j] = np. uint8(gray)
  24. 24
  25. 25#显示图像
  26. 26cv2.imshow( "Gray Image", grayImage)
  27. 27cv2.imshow( "Result", result)
  28. 28
  29. 29#等待显示
  30. 30cv2.waitKey( 0)
  31. 31cv2.destroyAllWindows()

图像灰度非线性变换的输出结果下图所示:

图像灰度对数变换

图像灰度的对数变换一般表示如公式所示:

其中c为尺度比较常数,DA为原始图像灰度值,DB为变换后的目标灰度值。如下图所示,它表示对数曲线下的灰度值变化情况。

由于对数曲线在像素值较低的区域斜率大,在像素值较高的区域斜率较小,所以图像经过对数变换后,较暗区域的对比度将有所提升。这种变换可用于增强图像的暗部细节,从而用来扩展被压缩的高值图像中的较暗像素。

对数变换实现了扩展低灰度值而压缩高灰度值的效果,被广泛地应用于频谱图像的显示中。一个典型的应用是傅立叶频谱,其动态范围可能宽达0~106直接显示频谱时,图像显示设备的动态范围往往不能满足要求,从而丢失大量的暗部细节;而在使用对数变换之后,图像的动态范围被合理地非线性压缩,从而可以清晰地显示。在下图中,未经变换的频谱经过对数变换后,增加了低灰度区域的对比度,从而增强暗部的细节。

下面的代码实现了图像灰度的对数变换。


   
  1. 1# -*- coding: utf -8 -*-
  2. 2import numpy as np
  3. 3import matplotlib.pyplot as plt
  4. 4import cv2
  5. 5
  6. 6#绘制曲线
  7. 7def log_plot(c):
  8. 8    x = np.arange( 02560.01)
  9. 9    y = c * np.log( 1 + x)
  10. 10    plt.plot(x, y,  'r', linewidth= 1)
  11. 11    plt.rcParams[ 'font.sans-serif']=[ 'SimHei'] #正常显示中文标签
  12. 12    plt.title(u '对数变换函数')
  13. 13    plt.xlim( 0255), plt.ylim( 0255)
  14. 14    plt.show()
  15. 15
  16. 16#对数变换
  17. 17def log(c, img):
  18. 18    output = c * np.log( 1.0 + img)
  19. 19    output = np. uint8(output +  0.5)
  20. 20     return output
  21. 21
  22. 22#读取原始图像
  23. 23img = cv2.imread( 'test.png')
  24. 24
  25. 25#绘制对数变换曲线
  26. 26log_plot( 42)
  27. 27
  28. 28#图像灰度对数变换
  29. 29output = log( 42, img)
  30. 30
  31. 31#显示图像
  32. 32cv2.imshow( 'Input', img)
  33. 33cv2.imshow( 'Output', output)
  34. 34cv2.waitKey( 0)
  35. 35cv2.destroyAllWindows()

下图表示经过对数函数处理后的效果图,对数变换对于整体对比度偏低并且灰度值偏低的图像增强效果较好。

对应的对数函数曲线如图

图像灰度伽玛变换

伽玛变换又称为指数变换或幂次变换,是另一种常用的灰度非线性变换。图像灰度的伽玛变换一般表示如公式所示:

  • 当γ>1时,会拉伸图像中灰度级较高的区域,压缩灰度级较低的部分。

  • 当γ<1时,会拉伸图像中灰度级较低的区域,压缩灰度级较高的部分。

  • 当γ=1时,该灰度变换是线性的,此时通过线性方式改变原图像。

Python实现图像灰度的伽玛变换代码如下,主要调用幂函数实现。


   
  1. 1# -*- coding: utf -8 -*-
  2. 2import numpy as np
  3. 3import matplotlib.pyplot as plt
  4. 4import cv2
  5. 5
  6. 6#绘制曲线
  7. 7def gamma_plot(c, v):
  8. 8    x = np.arange( 02560.01)
  9. 9    y = c*x**v
  10. 10    plt.plot(x, y,  'r', linewidth= 1)
  11. 11    plt.rcParams[ 'font.sans-serif']=[ 'SimHei'] #正常显示中文标签
  12. 12    plt.title(u '伽马变换函数')
  13. 13    plt.xlim([ 0255]), plt.ylim([ 0255])
  14. 14    plt.show()
  15. 15
  16. 16#伽玛变换
  17. 17def gamma(img, c, v):
  18. 18    lut = np.zeros( 256, dtype=np. float32)
  19. 19     for i in  range( 256):
  20. 20        lut[i] = c * i ** v
  21. 21    output_img = cv2.LUT(img, lut) #像素灰度值的映射
  22. 22    output_img = np. uint8(output_img+ 0.5)  
  23. 23     return output_img
  24. 24
  25. 25#读取原始图像
  26. 26img = cv2.imread( 'test.png')
  27. 27
  28. 28#绘制伽玛变换曲线
  29. 29gamma_plot( 0.000000054.0)
  30. 30
  31. 31#图像灰度伽玛变换
  32. 32output = gamma(img,  0.000000054.0)
  33. 33
  34. 34#显示图像
  35. 35cv2.imshow( 'Imput', img)
  36. 36cv2.imshow( 'Output', output)
  37. 37cv2.waitKey( 0)
  38. 38cv2.destroyAllWindows()

下图表示经过伽玛变换处理后的效果图,伽马变换对于图像对比度偏低,并且整体亮度值偏高(或由于相机过曝)情况下的图像增强效果明显。

对应的幂律函数曲线如图所示。

文章周日写于钟书阁,女神伴于旁。希望文章对大家有所帮助,如果有错误或不足之处,还请海涵。

原文链接:

https://blog.csdn.net/Eastmount/article/details/88929290

【End】

推荐阅读 

苹果或已放弃3月发布廉价新iPhone;贾跃亭回应家人巨额索赔;微软不再继续开发 Visual Basic | 极客头条

75.58 亿美元成交!美国最大规模 5G 毫米波频谱拍卖

超轻量级中文OCR,支持竖排文字识别、ncnn推理,总模型仅17M

和黑客斗争的 6 天!

一文了解 Spring Boot 服务监控,健康检查,线程信息,JVM堆信息,指标收集,运行情况监控!

用 3 个“鸽子”,告诉你闪电网络是怎样改变加密消息传递方式的!

你点的每一个在看,我认真当成了喜欢


转载:https://blog.csdn.net/csdnnews/article/details/104912594
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场