常见图像增强(python 实现)

Posted 挂科难

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常见图像增强(python 实现)相关的知识,希望对你有一定的参考价值。

反色变换

用于增强暗背景下的图像,使人眼能够观看到更多细节。
假设原始图像的灰度范围是[0,L],L表示该图像最大的灰度值,则反色变换为output = L - input

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

# 1,反色变换
# 假设原始图像的灰度范围是[0,L],L表示该图像最大的灰度值
# 则反色变换为output = L - input

def image_inverse(input):
    value_max = np.max(input)
    output = value_max - input
    return output

gray_img = np.asarray(Image.open('tulip.jpg').convert('L'))
inv_img = image_inverse(gray_img)

plt.subplot(121)
plt.title('original')
plt.imshow(gray_img, cmap='gray', vmin=0, vmax=255)

plt.subplot(122)
plt.title('inverse')
plt.imshow(inv_img, cmap='gray', vmin=0, vmax=255)
plt.show()

对数变换

对数变换,目的是压缩图像矩阵值域的动态范围,让我们可以看到更多细节
假设原始图像灰度取值范围是[x1,x2], (x1>=x2>=0)
则对数变换为 output = log(1 + input)
log输入为0时输出为负无穷,+1就是为了避免此情况(或者理解为偏置)

imshow绘图时,若不指定vmin,vmax,默认输入最小值为vmin对应0,vmax对应255

def set_Chinese():
    import  matplotlib
    matplotlib.rcParams['font.sans-serif'] = ['SimHei']
    matplotlib.rcParams['axes.unicode_minus'] = False

def image_log(input):
    return np.log(1 + input)

set_Chinese() # 解决中文乱码问题
input = np.array([[10, 150],
                  [250, 25500]])
output = image_log(input)
fig = plt.figure()
ax1 = fig.add_subplot(121)
ax1.set_title('对数变换前', fontsize=12)
ax1.imshow(input, cmap='gray', vmin=0, vmax=25500)

ax2 = fig.add_subplot(122)
ax2.set_title('对数变换后', fontsize=12)
ax2.imshow(output, cmap='gray')
plt.show()

伽马变换

又称幂律变换,因为使用幂函数来操作输入图像,表达式

  • gamma次幂称为伽马系数,在伽马变换中规定这个数必须为正数
  • eps 称为补偿系数,默认0(如果没有eps,当input中有为0时,对该像素的伽马变换就失效了,0的任意次幂都为0)

但幂运算又导致图像输出动态范围过大,引入归一化(8bit像素):

def gamma_trans(input, gamma=2, eps=0):
    return 255.*(((input + eps) / 255.) ** gamma)


def update_gamma(val):
    gamma = slider1.val
    output = gamma_trans(input_arr, gamma=gamma, eps=0.5)
    print('------------\\n', output)
    ax1.set_title('伽马变换后,gamma = ' + str(gamma))
    ax1.imshow(output, cmap='gray', vmin=0, vmax=255)


set_Chinese()
input_arr = np.array([[0, 50, 100, 150],
                    [0, 50, 100, 150],
                    [0, 50, 100, 150],
                    [0, 50, 100, 150]])

fig = plt.figure()
ax0 = fig.add_subplot(121)
ax0.set_title('输入矩阵')
ax0.imshow(input_arr, cmap='gray', vmin=0, vmax=255)

ax1 = fig.add_subplot(122)

plt.subplots_adjust(bottom=0.3)  # 划分一块滑动条,从底部向上30%
# 设置属性和颜色
s1 = plt.axes([0.25, 0.1, 0.55, 0.03], facecolor='lightgoldenrodyellow')
# 创建滑动条,范围0-2,初始为1,步长0.1
slider1 = Slider(s1, '参数gamma', 0.0, 2.0, valfmt='%.f', valinit=1.0, valstep=0.1)
slider1.on_changed(update_gamma)
plt.show()


肉眼观测的话gamma(>1)越大图像越黑,gamma(<1)越小图像越亮。
应用:

  • 矫正显示失真

以上是关于常见图像增强(python 实现)的主要内容,如果未能解决你的问题,请参考以下文章

常见图像增强(python 实现)

[OpenCV实战]20 使用OpenCV实现基于增强相关系数最大化的图像对齐

Python从0到1丨细说图像增强及运算

Python从0到1丨细说图像增强及运算

Python从0到1丨细说图像增强及运算

OpenCV每日函数 对象追踪模块 使用增强相关系数 (ECC) 最大化的图像配准