图像对比度增强的方法及其Python实现

引言

图像对比度是指图像中不同亮度级别之间的差异程度。在一幅对比度较低的图像中,不同物体或者物体的细节很难被分辨出来。图像对比度增强是一种常用的图像处理技术,可以提高图像的可视性和观感。本文将介绍图像对比度增强的常见方法,并使用Python编写代码示例实现。

方法一:直方图均衡化

直方图均衡化是一种常用的图像对比度增强方法。它通过重新分布图像的像素值,使得各个亮度级别的像素在图像中均匀分布,从而增强图像的对比度。

直方图均衡化的原理如下:

  1. 统计图像中各个亮度级别的像素数量,得到原始图像的直方图。
  2. 计算原始直方图的累计分布函数(CDF)。
  3. 根据CDF将原始图像的像素值映射到新的像素值,重新分布像素。

下面是使用Python实现直方图均衡化的代码示例:

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

# 计算直方图
histogram, bins = np.histogram(image.flatten(), 256, [0, 256])

# 计算累计分布函数
cdf = histogram.cumsum()
cdf_normalized = cdf * histogram.max() / cdf.max()

# 原始图像与均衡化后的图像的像素映射关系
cdf_m = np.ma.masked_equal(cdf, 0)
cdf_m = (cdf_m - cdf_m.min()) * 255 / (cdf_m.max() - cdf_m.min())
cdf = np.ma.filled(cdf_m, 0).astype('uint8')

# 将原始图像的像素值映射到新的像素值
image_equalized = cdf[image]

# 显示原始图像和均衡化后的图像
plt.subplot(2, 1, 1)
plt.imshow(image, cmap='gray')
plt.title('Original Image')
plt.xticks([])
plt.yticks([])

plt.subplot(2, 1, 2)
plt.imshow(image_equalized, cmap='gray')
plt.title('Equalized Image')
plt.xticks([])
plt.yticks([])

plt.show()

运行上述代码,可以得到原始图像和经过直方图均衡化处理后的图像。可以看到,经过直方图均衡化处理后的图像对比度得到了显著增强。

方法二:对比度拉伸

对比度拉伸是另一种常用的图像对比度增强方法。它通过线性或非线性的变换函数,将图像的亮度范围拉伸到更大的范围,从而增强图像的对比度。

对比度拉伸的原理如下:

  1. 选择一个合适的变换函数,将原始图像的像素值映射到新的像素值。
  2. 对图像进行像素级别的变换,将原始图像的亮度范围映射到更大的范围。

下面是使用Python实现对比度拉伸的代码示例:

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

# 对比度拉伸的参数
alpha = 1.5
beta = 50

# 对图像进行对比度拉伸
image_stretched = np.clip(alpha * image + beta, 0, 255).astype(np.uint8)

# 显示原始图像和拉伸后的图像
plt.subplot(2, 1, 1)
plt.imshow(image, cmap='gray')
plt.title('Original Image')
plt.xticks([])
plt.yticks([])

plt.subplot(2, 1, 2)
plt.imshow(image_stretched, cmap='gray')
plt.title('Stretched Image')
plt.xticks([])
plt.yticks([])

plt.show