首页
学习
活动
专区
圈层
工具
发布

数字图像处理灰度变换之对数变换、伽马变换及python实现

对数变换

对数变换的通用公式是: s=c log(1+r);

其中,c是一个常数,对数变换,将源图像中范围较窄的低灰度值映射到范围较宽的灰度区间,同时将范围较宽的高灰度值区间映射为较窄的灰度区间,从而扩展了暗像素的值,压缩了高灰度的值,能够对图像中低灰度细节进行增强。 对数变换曲线如下图。

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

代码语言:javascript
代码运行次数:0
复制
# -*- 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实现图像灰度的伽玛变换代码如下,主要调用幂函数实现。

代码语言:javascript
代码运行次数:0
复制
# -*- 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()
下一篇
举报
领券