灰度变换 - 对数变换

目录

1. 原理

2. 代码


1. 原理

对数变换的公式为:

dst = c * log(1 + src)

其中:c是伸缩系数,常设为1。src为输入的原图像,dst为经过对数变换的输出图像

对数变换的曲线为:

灰度变换 - 对数变换_第1张图片

由曲线的形状可以发现,对数变换将输入中范围较窄的低灰度值映射为输出中灰度值较宽的部分。也就是对数变换可以提升原图中暗区的对比度,同时可以压缩明亮区的对比度。

反对数变换的效果刚好相反

2. 代码

import numpy as np
import cv2


def log(x):
    y =np.log(1+x)
    ym = y- y.min()
    dst = (ym / ym.max()) * 255
    return dst.astype(np.uint8)

img = cv2.imread('./f.jpg',0)
dst = log(img)
cv2.imshow('img',np.hstack((img,dst)))
cv2.waitKey()
cv2.destroyAllWindows()

处理的结果为

灰度变换 - 对数变换_第2张图片

 

注:

因为图像经过对数变换后的值域很小,所以需要放大到0-255范围当中

  • 一般来说可以直接将对数变换后的图像dst / dst.max(),然后在乘上255
  • 图中演示的代码为图像处理书上给出的缩放Gm = Gm - Gm.min() , dst = Gm / Gm.max()在乘上255
  • 两者的区别是。书上的可以将灰度值最低的部分映射为0,而第一种方法有时候会出现这样的情况。这是因为图像的背景部分虽然是黑色,但灰度值不是0,经过对数变换会将灰度值低的区域对比度拉伸,所以会出现灰蒙蒙的样子

灰度变换 - 对数变换_第3张图片

  •  而使用书上的方法则不会出现这种情况

灰度变换 - 对数变换_第4张图片

 

你可能感兴趣的:(数字图像处理,图像处理,人工智能)