灰度映射是一种基于图像像素的点操作,图像的灰度线性变换是通过建立灰度映射来调整原始图像的灰度,从而改善图像的质量,凸显图像的细节,提高图像的对比度。灰度线性变换的计算公式如下所示:
1)求反就是将像素点的颜色变成与原先相反的颜色,这里的“相反”指的是用色彩值的最高值 255 减去原先的色彩值。
求反,灰度s根据映射曲线映射为t的公式:
t = L–1–s
2)动态范围压缩。传统显示设备所能显示的场景、视频和图像通常受限于硬件设备,通常只能表达出很小一部分的亮度范围,比如如常见的 8 比特图像显示 0 到 255 的整数范围,因此为了能够显示高动态范围的影响,需要实现从高动态范围图像(HDR)到低动态范围图像(LDR)的映射,并且不同显示设备的出现,需要实现 HDR 和之间的相互转换 ,即动态范围压缩(DRC,Dynamic Range Compression)。实现动态范围压缩有许多种算法,比如线性移位算法、对数映射算法、分段函数映射算法、自适应性对数映射算法、高动态范围图像可视化算法。
线性移位算法是最简单的 DRC 算法,它将以 n 比特整数表示的 HDR 图像直接右移(n—m)个比特得 m(m 3)阶梯量化。阶梯量化算法将图像灰度分阶段量化成较少的级数,获得数据量压缩的效果,量化函数图形如下所示: 本实验将映射函数分每个阶段代表相应的以 64 为倍数的灰度值,0-63 对应值为 0,64-127 对应值为 64,128-191 对应值为 128,其他值对应为 192。 4)图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单、计算量小、性能较稳定而成为图像分割中最基本和应用最广泛的分割技术。它特别适用于目标和背景占据不同灰度级范围的图像。难点在于如何选择一个合适的阈值实现较好的分割。 当 T 是一个适用于整个图像的常数时,该公式给出的处理成为全局阈值处理; 当 T 值在一副图像上改变时,称为可变阈值处理; 当 T 取决于空间坐标 x, y 本身的时候,则可变阈值处理称为动态阈值处理。 当 f(x,y)大于阈值 T 时,其g(x,y)为 1,表示白色;当 f(x,y)小于或等于阈值 T 时,其 g(x,y)值为 0,表示黑色。 运行代码说明 1.要改变代码中的地址 更改 2.注意最后的2 代码
put(path)
函数中的路径put(r'../image/image1.jpg')
plt.savefig('1.new.jpg')
是保存plt图像,如果不使用可以注释掉import numpy as np
import cv2
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
def put(path):
img = cv2.imread(path, 1)
# 求反
rev_img = 255 - np.array(img)
# 动态范围压缩
log_img = np.uint8(42 * np.log(1.0 + img))
# 阶梯量化
img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
step_img = np.zeros((img2.shape[0], img2.shape[1]))
for i in range(img2.shape[0]):
for j in range(img2.shape[1]):
if img2[i, j] < 64:
step_img[i,j] = 0
elif img2[i, j] < 128:
step_img[i,j] = 64
elif img2[i, j] <192:
step_img[i, j] = 128
else:
step_img[i,j] = 192
# 阈值分割
threshold_img = cv2.adaptiveThreshold(img2, 114, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
# 画图
fig = plt.figure(figsize=(10,7))
ax5 = fig.add_subplot(231)
ax5.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
ax5.set_title('原图')
ax1 = fig.add_subplot(232)
ax1.imshow(cv2.cvtColor(rev_img, cv2.COLOR_BGR2RGB))
ax1.set_title('求反')
ax2 = fig.add_subplot(233)
ax2.imshow(cv2.cvtColor(log_img, cv2.COLOR_BGR2RGB))
ax2.set_title('动态范围压缩')
ax6 = fig.add_subplot(234)
ax6.imshow(img2, cmap='gray')
ax6.set_title('灰度图')
ax3 = fig.add_subplot(235)
ax3.imshow(step_img,cmap='gray')
ax3.set_title('灰度图阶梯量化')
ax4 = fig.add_subplot(236)
ax4.imshow(threshold_img,cmap='gray')
ax4.set_title('灰度图阈值分割')
# plt.savefig('1.newimage1.jpg')
plt.show()
# 处理函数,要传入路径
put(r'../image/image1.jpg')
3 效果