import cv2
import copy
import math
import matplotlib.pyplot as plt
o=cv2.imread('C:/Users/xpp/Desktop/Lena.png',cv2.IMREAD_GRAYSCALE)#原始图像
cv2.imshow("original",o)
logc=copy.deepcopy(o)
rows=o.shape[0]
cols=o.shape[1]
for i in range(rows):#对数变换
for j in range(cols):
logc[i][j]=3*math.log(1+logc[i][j])
cv2.imshow("result",logc)
cv2.waitKey()
cv2.destroyAllWindows()

算法:对数变换是非线性变换。对数变换应用在增强图像的暗部细节,从而用来扩展被压缩的高值图像中的较暗像素。对数变换实现了扩展低灰度值而压缩高灰度值的效果,被广泛地应用于频谱图像的显示中。一个典型的应用是傅立叶频谱,其动态范围可能宽达0~106直接显示频谱时,图像显示设备的动态范围往往不能满足要求,从而丢失大量的暗部细节;而在使用对数变换之后,图像的动态范围被合理地非线性压缩,从而可以清晰地显示。
对数变换的一般形式为:
s=T(r)=c*log(1+r)
其中,r为原始图像灰度值,c为尺度比较常数,s为对数变换后的目标灰度值。
例子:

由于对数曲线在像素值较低的区域斜率大,在像素值较高的区域斜率较小,所以图像经过对数变换后,较暗区域的对比度将有所提升。