基本的灰度变换函数——对数变换

对数变换的通用形式为:s=clog(1+r),其中c是一个常数,r\geqslant 0

由对数函数的性质可知,改变换将范围较窄的低灰度值映射为较宽范围的灰度值,相反地,对高输入灰度值也是如此。

我们使用这种类型的变换来扩展图像中,暗像素的值,同时压缩更高灰度级的值。反对数变换的作用与此相反。

下面用Python实现图像的对数变换:

使用的图片数据为:

 导入要使用的第三方库:

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import math

 读取图片并可视化:

img = Image.open('小亮点.jpg')
plt.axis('off')
plt.imshow(img)
plt.show()

 

 将图像数据转换为numpy数组:

img_data = np.array(img)

 定义变换函数:

def logarithm_transformation(img, func):
    img_data = np.array(img)
    a = np.shape(img_data)
    new_img = []
    for i in range(a[0]):
        new_row = []
        for j in range(a[1]):
            data = list(img_data[i][j])
            new_data = func(data)
            new_row.append(np.array(new_data))
        new_img.append(np.array(new_row))
    return new_img
def function(data):
    new_data = []
    for k in data:
        a = int(1*math.log(1+k))
        new_data.append(a)
    return new_data

 调用,并可视化结果:

new_img = logarithm_transformation(img, function)
new_img = np.array(new_img)
new_img = Image.fromarray(new_img.astype('uint8')).convert('RGB')

plt.figure(figsize=(72,128))
plt.subplot(121)
plt.axis('off')
gray1 = new_img.convert('L')
plt.imshow(gray1, cmap='gray')
plt.subplot(122)
plt.axis('off')
plt.imshow(img, cmap='gray')
plt.show()

 该例子中使用的参数c=1:

左侧为目标结果图像,右侧为原图像 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章