对数变换的通用形式为:,其中c是一个常数,
由对数函数的性质可知,改变换将范围较窄的低灰度值映射为较宽范围的灰度值,相反地,对高输入灰度值也是如此。
我们使用这种类型的变换来扩展图像中,暗像素的值,同时压缩更高灰度级的值。反对数变换的作用与此相反。
下面用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:
左侧为目标结果图像,右侧为原图像