任务
1.读取彩色输入图像,可视化;
2.基于直方图均衡化的彩色图像对比度增强: 将输入图像由RGB空间映射至HSV空间,保持H与S通道不变,对亮度通道V进行直方图均衡化,映射回RGB空间,保存并可视化图像;
3. 直方图均衡化+饱和度增强:将输入图像映射至HSV空间,固定H不变;对亮度通道V直方图均衡化;对各像素的S通道增加一个小正数(如0.1, 0.3),并确保增加后不超过1。最后由HSV空间映射回RGB空间,保存并可视化结果。
比较原始输入图像,以及两种处理结果,理解对比度增强以及饱和度增强。
代码
from PIL import Image
from pylab import *
import cv2
import numpy as np
import math
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
img = array(Image.open(r'input.jpg'))
cv2.imshow('a',img)
cv2.waitKey(0)
# 将BGR图像转换到HSV空间中
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 将HSV图像通道分离
channels = cv2.split(hsv)
# 对第1个通道即色调通道进行全局直方图均衡化并保存
cv2.equalizeHist(channels[2],channels[2])
# 将处理后的通道和没有处理的两个通道合并,命名为hsv
cv2.merge(channels,hsv)
# 将HSV图像转换回BGR图像
cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR, img)
cv2.imshow('b',img)
cv2.waitKey(0)
hsv = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2HSV)
h, s, v = cv2.split(hsv)
cv2.equalizeHist(s, s)
s = cv2.add(s, 0.3)
h = cv2.convertScaleAbs(h)
s = cv2.convertScaleAbs(s)
v = cv2.convertScaleAbs(v)
hsv = cv2.merge([h, s, v])
img = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
cv2.imshow('c', img)
cv2.waitKey(0)
cv2.destroyAllWindows()