敞开生长之旅!这是我参加「日新计划 12 月更文挑战」的第8天,点击检查活动概况
前语
对比度、亮度增强技术是两种非常常见技术,这些技术是在许多图画处理使命(例如,图画分类)中运用预处理过程。在本节中,咱们将学习如何运用 OpenCV
库来修正图画的对比度和亮度。
运用线性变换改动图画的亮度/对比度
乘法和加法是两种常用的图画操作运算,运用这两种运算能够组成根本线性变换:g(x)=f(x)+g(x)=f(x)+,其间常数参数 >0>0 和 一般分别称为对比度(增益)和亮度(偏置)参数。能够将 f(x)f(x) 视为源图画像素,而 g(x)g(x) 则是输出图画像素,因而,咱们能够将表达式改写为 g(i,j)=⋅f(i,j)+g(i,j)=f(i,j)+,其间 ii 和 jj 表明像素位于第 ii 行和第 jj 列中。在本节中,咱们将学习如何运用 OpenCV
的 convertscaleabs()
完成根本线性变换,并调查其对图画的影响,该函数用法如下:
cv2.convertScaleAbs(src, alpha, beta)
在输入图画的每个通道上,该函数次序执行三个操作,缩放,核算绝对值,转化为无符号的 8
位类型(对于输入图画 srcsrc,返回的输出图画是 src∗alpha+betasrc*alpha+beta)。
幂转化也称为 gamma
校对,当 >1>1 时图画将转移到频谱的黑色端,而在 <1<1 时会使图画显得偏淡,运用 LUT()
函数能够将图画的查找表更改为具有幂转化的新图画,该用法函数如下:
cv2.LUT(src, lut)
首先导入所需的库和函数,并加载输出图画,然后运用 OpenCV
函数界说函数 basic_linear_transform()
和 gamma_correction()
分别完成对比度修正和伽马校对:
import cv2
import numpy as np
import matplotlib.pylab as plt
alpha, beta, gamma = 1, 0, 1
def basic_linear_transform(img, alpha, beta):
return cv2.convertScaleAbs(img, alpha=alpha, beta=beta)
def gamma_correction(img, gamma):
lookup_table = np.empty((1,256), np.uint8)
for i in range(256):
lookup_table[0,i] = np.clip(pow(i / 255.0, gamma) * 255.0, 0, 255)
return cv2.LUT(img, lookup_table)
image = cv2.imread('1.png')
用不同的 alpha
和 gamma
值调用函数 basic_linear_transform()
以改动输入图画的亮度,并绘制输出图画:
plt.figure(figsize=(20,20))
i = 1
for alpha in [0.25, 0.5, 1, 1.5, 2.5]:
for beta in [0, 0.5, 1, 1.5, 2]:
image_corrected = basic_linear_transform(image, alpha, beta)
plt.subplot(5,5,i), plt.imshow(cv2.cvtColor(image_corrected, cv2.COLOR_BGR2RGB)), plt.axis('off')
plt.title(r'$\alpha$={:.2f}, $\beta$={:.2f}'.format(alpha, beta), size=10)
i += 1
plt.suptitle('Basic linear transform to change brightness', size=20)
plt.show()
用不同的 gamma
参数值调用函数 gamma_correction()
,并绘制输出图画:
plt.figure(figsize=(20,20))
i = 1
for gamma in np.linspace(0, 2, 16):
image_gamma_corrected = gamma_correction(image, gamma)
plt.subplot(4,4,i), plt.imshow(cv2.cvtColor(image_gamma_corrected, cv2.COLOR_BGR2RGB)), plt.axis('off')
plt.title(r'$\gamma$={:.2f}'.format(gamma), size=10)
i += 1
plt.suptitle('Gamma correction', size=20)
plt.show()