### **对数变换** 对数变换的通用公式是: $$ s = c*log(1+r) $$ 其中,c是一个常数,对数变换,将源图像中范围较窄的低灰度值映射到范围较宽的灰度区间,同时将范围较宽的高灰度值区间映射为较窄的灰度区间,从而扩展了暗像素的值,压缩了高灰度的值,能够对图像中低灰度细节进行增强。 对数变换曲线如下图。 ![](http://cookdata.cn/media/bbs/images/1_1600836790933_5d14.jpg) 下面的代码实现了图像灰度的对数变换。 ```python # -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt import cv2 #对数变换 def log(c, img): output = c * np.log(1.0 + img) output = np.uint8(output + 0.5) return output #读取原始图像 img = cv2.imread('test.png') #图像灰度对数变换 output = log(42, img) #显示图像 cv2.imshow('Input', img) cv2.imshow('Output', output) cv2.waitKey(0) cv2.destroyAllWindows() ``` 对数变换对于整体对比度偏低并且灰度值偏低的图像增强效果较好。 ## **幂律变换(伽马变换)** 伽马变换主要用于图像的校正,对灰度值过高(图像过亮)或者过低(图像过暗)的图像进行修正,增加图像的对比度,从而改善图像的显示效果。伽马变换的公式为: s= caⁿ $$ s = c*a^n $$ 其中c和n为正常数。 伽马变换的效果与对数变换有点类似,但是,情况相反,与反对数变换类似。其函数曲线如下 ![](http://cookdata.cn/media/bbs/images/2_1600837086543_5d14.jpg) 当伽马大于1拉伸高像素值的范围压缩灰度级较低的部分,当伽马小于1拉伸低像素值的范围压缩灰度级较高的部分。哪部分的斜率越大,哪部分的拉伸比例就越大。当n=1时,该灰度变换是线性的,此时通过线性方式改变原图像。 Python实现图像灰度的伽玛变换代码如下,主要调用幂函数实现。 ```python # -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt import cv2 #伽玛变换 def gamma(img, c, v): lut = np.zeros(256, dtype=np.float32) for i in range(256): lut[i] = c * i ** v output_img = cv2.LUT(img, lut) #像素灰度值的映射 output_img = np.uint8(output_img+0.5) return output_img #读取原始图像 img = cv2.imread('test.png') #图像灰度伽玛变换 output = gamma(img, 0.00000005, 4.0) #显示图像 cv2.imshow('Imput', img) cv2.imshow('Output', output) cv2.waitKey(0) cv2.destroyAllWindows() ```