对数变换的通用公式是: s=c log(1+r);
其中,c是一个常数,对数变换,将源图像中范围较窄的低灰度值映射到范围较宽的灰度区间,同时将范围较宽的高灰度值区间映射为较窄的灰度区间,从而扩展了暗像素的值,压缩了高灰度的值,能够对图像中低灰度细节进行增强。 对数变换曲线如下图。
下面的代码实现了图像灰度的对数变换。
# -*- 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ⁿ
其中c和n为正常数。 伽马变换的效果与对数变换有点类似,但是,情况相反,与反对数变换类似。其函数曲线如下
当伽马大于1拉伸高像素值的范围压缩灰度级较低的部分,当伽马小于1拉伸低像素值的范围压缩灰度级较高的部分。哪部分的斜率越大,哪部分的拉伸比例就越大。当n=1时,该灰度变换是线性的,此时通过线性方式改变原图像。 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()