数字图像处理(入门篇)七 图像数据预处理之灰度变化

目录

一 常用操作

1 反转

2 对比度增强

3 对比度压缩

4 伽马矫正

二 实践

1 反转、对比度增强和对比度压缩

(1) 代码 

(2) 结果图

 2 伽马矫正

(1) 代码

(2) 结果图

(3) 结论

(4) np.power函数

图像灰度变换:将原始图像中的每一个点的灰度值,按照特定的映射函数,变换为另一个灰度值的过程。

灰度变换是对每一个像素点单独的操作。像素点原始像素值为x,灰度变换映射函数为T(x),变换后的像素值为y,公式为:y = T(x)

常用的操作有:反转、 对比度增强、对比度压缩和 伽马矫正。

一 常用操作

1 反转

将图像灰度值反转的操作,即黑色变成白色,白色变成黑色的过程。

映射函数如下:

数字图像处理(入门篇)七 图像数据预处理之灰度变化_第1张图片

2 对比度增强

通过增加相邻灰度级的灰度差别实现。

映射函数如下: 

数字图像处理(入门篇)七 图像数据预处理之灰度变化_第2张图片

 从上图可以看出,(d2 - d1)> (s2 - s1),[s1, s2]区间的像素点被拉伸到 [d1, d2]区间,达到了对比度增强的效果。

3 对比度压缩

通过减小相邻灰度级的灰度差别实现。

映射函数如下:

数字图像处理(入门篇)七 图像数据预处理之灰度变化_第3张图片

 从上图可以看出,(d2 - d1)< (s2 - s1),[s1, s2]区间的像素点被压缩到 [d1, d2]区间,达到了对比度压缩的效果。 

4 伽马矫正

伽马矫正:借助了指数变换映射的增强技术。公式如下:

 

 数字图像处理(入门篇)七 图像数据预处理之灰度变化_第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) 结果图

 数字图像处理(入门篇)七 图像数据预处理之灰度变化_第5张图片

 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) 结果图

数字图像处理(入门篇)七 图像数据预处理之灰度变化_第6张图片

(3) 结论

从上图中,可以看出:

(4) np.power函数

import numpy as np

print(np.power(2, 4))

分析:输出2的4次方

结果为:16

你可能感兴趣的:(数字图像处理,计算机视觉,图像处理,python)