目录
一 常用操作
1 反转
2 对比度增强
3 对比度压缩
4 伽马矫正
二 实践
1 反转、对比度增强和对比度压缩
(1) 代码
(2) 结果图
2 伽马矫正
(1) 代码
(2) 结果图
(3) 结论
(4) np.power函数
图像灰度变换:将原始图像中的每一个点的灰度值,按照特定的映射函数,变换为另一个灰度值的过程。
灰度变换是对每一个像素点单独的操作。像素点原始像素值为x,灰度变换映射函数为T(x),变换后的像素值为y,公式为:y = T(x)
常用的操作有:反转、 对比度增强、对比度压缩和 伽马矫正。
一 常用操作
1 反转
将图像灰度值反转的操作,即黑色变成白色,白色变成黑色的过程。
映射函数如下:
2 对比度增强
通过增加相邻灰度级的灰度差别实现。
映射函数如下:
从上图可以看出,(d2 - d1)> (s2 - s1),[s1, s2]区间的像素点被拉伸到 [d1, d2]区间,达到了对比度增强的效果。
3 对比度压缩
通过减小相邻灰度级的灰度差别实现。
映射函数如下:
从上图可以看出,(d2 - d1)< (s2 - s1),[s1, s2]区间的像素点被压缩到 [d1, d2]区间,达到了对比度压缩的效果。
4 伽马矫正
伽马矫正:借助了指数变换映射的增强技术。公式如下:
二 实践
1 反转、对比度增强和对比度压缩
(1) 代码
使用 OpenCV 的 look up table 函数(cv2.LUT)修改图像的灰度值。
import numpy as np
import matplotlib.pyplot as plt
import cv2
def linear_trans_img(img, k, b=0):
trans_list = [(np.float32(x)*k+b) for x in range(256)]
trans_table = np.array(trans_list)
trans_table[trans_table > 255] = 255
trans_table[trans_table < 0] = 0
trans_table = np.round(trans_table).astype(np.uint8)
return cv2.LUT(img, trans_table)
def run(img_path):
img = cv2.imread(img_path, 0)
reversal_img = linear_trans_img(img, -1, 255)# 反转
stretch_img = linear_trans_img(img, 1.5)# k>1,拉伸
compress_img = linear_trans_img(img, 0.5)# K<1,压缩
titles = ["img", "reversal", "stretch", "compress"]
images = [img, reversal_img, stretch_img, compress_img]
for i in range(4):
plt.subplot(2, 2, i + 1), plt.imshow(images[i], 'gray')
plt.title(titles[i])
plt.xticks([]), plt.yticks([])
plt.show()
if __name__ == '__main__':
run("test_rgb.jpg")
pass
(2) 结果图
2 伽马矫正
(1) 代码
使用 OpenCV 的 look up table 函数(cv2.LUT)修改图像的灰度值。
import numpy as np
import matplotlib.pyplot as plt
import cv2
def gamma_trans_img(img, gamma):
gamma_list = [np.power(x / 255.0, gamma) * 255.0 for x in range(256)]
gamma_table = np.round(np.array(gamma_list)).astype(np.uint8)
return cv2.LUT(img, gamma_table)
def run(img_path):
img = cv2.imread(img_path)
gray_img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
gamma_1 = gamma_trans_img(gray_img, 0.5)
gamma_2 = gamma_trans_img(gray_img, 1.5)
titles = ["original", "gray", "gamma=0.5", "gamma=1.5"]
images = [img, gray_img, gamma_1, gamma_2]
for i in range(4):
plt.subplot(2, 2, i + 1), plt.imshow(images[i], 'gray')
plt.title(titles[i])
plt.xticks([]), plt.yticks([])
plt.show()
if __name__ == '__main__':
run("test_rgb.jpg")
pass
(2) 结果图
(3) 结论
从上图中,可以看出:
(4) np.power函数
import numpy as np
print(np.power(2, 4))
分析:输出2的4次方。
结果为:16