三、直方图均衡化
1. 普通直方图均衡化
直方图均衡化的原理是将图像的灰度直方图展平,使得每个灰度级都有更多的像素分布,从而增强图像的对比度。具体步骤如下:
- 计算灰度直方图:统计图像中每个灰度级的像素数量。
- 计算累积分布函数(CDF):计算每个灰度级的累积概率。
- 映射灰度值:将原始图像中的每个灰度值映射到新的灰度值,使得新的灰度分布更加均匀。
- 生成均衡化后的图像:使用映射后的灰度值生成新的图像。
import cv2
import numpy as np
import matplotlib.pyplot as pltdef histogram_equalization(image):"""直方图均衡化:param image: 输入图像(灰度图像):return: 处理后的图像"""if len(image.shape) == 3:image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)equalized_image = cv2.equalizeHist(image)return equalized_imagedef main():# 读取图像image = cv2.imread('demo.jpg')if image is None:print("Error: Could not read image.")return# 直方图均衡化equalized_image = histogram_equalization(image)# 显示原始图像和处理后的图像plt.figure(figsize=(8, 4))plt.subplot(1, 2, 1)plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))plt.title('Original Image')plt.axis('off')plt.subplot(1, 2, 2)plt.imshow(equalized_image, cmap='gray')plt.title('Histogram Equalized Image')plt.axis('off')plt.tight_layout()plt.show()# 显示直方图plt.figure(figsize=(12, 6))plt.subplot(1, 2, 1)plt.hist(image.ravel(), 256, [0, 256], color='gray', alpha=0.7)plt.title('Histogram of Original Image')plt.xlabel('Pixel Value')plt.ylabel('Frequency')plt.subplot(1, 2, 2)plt.hist(equalized_image.ravel(), 256, [0, 256], color='gray', alpha=0.7)plt.title('Histogram of Equalized Image')plt.xlabel('Pixel Value')plt.ylabel('Frequency')plt.tight_layout()plt.show()if __name__ == "__main__":
2. 限制对比度自适应直方图均衡化(Contrast Limited Adaptive Histogram Equalization, CLAHE)
限制对比度自适应直方图均衡化在直方图均衡化的基础上进行了改进,通过限制对比度和局部均衡化来避免过度增强图像的对比度,从而减少噪声和不自然的效果。基本原理如下:
- 图像分割:将图像分割成若干个小块(称为“tiles”),每个小块的大小由 tileGridSize 参数指定。
- 局部均衡化:对每个小块分别进行直方图均衡化。为了限制对比度,使用 clipLimit 参数来限制每个小块的直方图中像素值的最大数量。
- 插值平滑:将每个小块均衡化后的结果通过插值技术合并,以避免明显的边界和不连续性。
import cv2
import numpy as np
import matplotlib.pyplot as pltdef clahe_equalization(image, clipLimit=2.0, tileGridSize=(8, 8)):"""CLAHE均衡化:param image: 输入图像(灰度图像):param clipLimit: 对比度限制阈值:param tileGridSize: 小块大小:return: 处理后的图像"""if len(image.shape) == 3:image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)clahe = cv2.createCLAHE(clipLimit=clipLimit, tileGridSize=tileGridSize)clahe_image = clahe.apply(image)return clahe_imagedef main():# 读取图像image = cv2.imread('demo.jpg')if image is None:print("Error: Could not read image.")return# CLAHE均衡化clahe_image = clahe_equalization(image, clipLimit=2.0, tileGridSize=(8, 8))# 显示原始图像和处理后的图像plt.figure(figsize=(8, 4))plt.subplot(1, 2, 1)plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))plt.title('Original Image')plt.axis('off')plt.subplot(1, 2, 2)plt.imshow(clahe_image, cmap='gray')plt.title('CLAHE Equalized Image')plt.axis('off')plt.tight_layout()plt.show()# 显示直方图plt.figure(figsize=(12, 6))plt.subplot(1, 2, 1)plt.hist(image.ravel(), 256, [0, 256], color='gray', alpha=0.7)plt.title('Histogram of Original Image')plt.xlabel('Pixel Value')plt.ylabel('Frequency')plt.subplot(1, 2, 2)plt.hist(clahe_image.ravel(), 256, [0, 256], color='gray', alpha=0.7)plt.title('Histogram of CLAHE Equalized Image')plt.xlabel('Pixel Value')plt.ylabel('Frequency')plt.tight_layout()plt.show()if __name__ == "__main__":main()
四、空间域(增强)
空间域增强方法直接操作图像的像素值,常用于提高图像的可视性和特征表现。空间域增强方法可以分为线性滤波和非线性滤波两大类。此外,边缘检测也是一种重要的空间域增强技术,用于突出图像中的边缘和细节。
1. 线性滤波
线性滤波通过卷积操作对图像进行处理,常用的线性滤波器包括方框滤波、均值滤波器、高斯滤波器和锐化滤波器等。
(1) 方框滤波(Box Filtering)
方框滤波是一种简单的均值滤波,通过计算每个像素邻域内的平均值来平滑图像。具体来说,对于每个像素,取其邻域内的所有像素值的平均值作为该像素的新值。
import cv2
import numpy as np
import matplotlib.pyplot as pltdef box_filter(image, kernel_size=(3, 3)):"""方框滤波:param image: 输入图像:param kernel_size: 滤波器大小:return: 处理后的图像"""filtered_image = cv2.boxFilter(image, -1, kernel_size)return filtered_imagedef main():# 读取图像image = cv2.imread('demo.jpg')if image is None:print("Error: Could not read image.")return# 方框滤波box_filtered_image = box_filter(image, kernel_size=(5, 5))# 显示原始图像和处理后的图像plt.figure(figsize=(8, 4))plt.subplot(1, 2, 1)plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))plt.title('Original Image')plt.axis('off')plt.subplot(1, 2, 2)plt.imshow(cv2.cvtColor(box_filtered_image, cv2.COLOR_BGR2RGB))plt.title('Box Filtered Image')plt.axis('off')plt.tight_layout()plt.show()if __name__ == "__main__":main()
(2) 均值滤波器(Mean Filter)
均值滤波器通过计算每个像素邻域内的平均值来平滑图像。具体来说,对于每个像素,取其邻域内的所有像素值的平均值作为该像素的新值。
import cv2
import numpy as np
import matplotlib.pyplot as pltdef mean_filter(image, kernel_size=(3, 3)):"""均值滤波:param image: 输入图像:param kernel_size: 滤波器大小:return: 处理后的图像"""filtered_image = cv2.blur(image, kernel_size)return filtered_imagedef main():# 读取图像image = cv2.imread('demo.jpg')if image is None:print("Error: Could not read image.")return# 均值滤波mean_filtered_image = mean_filter(image, kernel_size=(5, 5))# 显示原始图像和处理后的图像plt.figure(figsize=(8, 4))plt.subplot(1, 2, 1)plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))plt.title('Original Image')plt.axis('off')plt.subplot(1, 2, 2)plt.imshow(cv2.cvtColor(mean_filtered_image, cv2.COLOR_BGR2RGB))plt.title('Mean Filtered Image')plt.axis('off')plt.tight_layout()plt.show()if __name__ == "__main__":main()
(3) 高斯滤波器(Gaussian Filter)
高斯滤波器通过高斯核对图像进行卷积操作,以平滑图像并减少噪声。高斯核的权重分布符合高斯分布,中心权重最大,边缘权重逐渐减小。
import cv2
import numpy as np
import matplotlib.pyplot as pltdef gaussian_filter(image, kernel_size=(5, 5), sigmaX=0):"""高斯滤波:param image: 输入图像:param kernel_size: 滤波器大小:param sigmaX: 高斯核的标准差:return: 处理后的图像"""filtered_image = cv2.GaussianBlur(image, kernel_size, sigmaX)return filtered_imagedef main():# 读取图像image = cv2.imread('demo.jpg')if image is None:print("Error: Could not read image.")return# 高斯滤波gaussian_filtered_image = gaussian_filter(image, kernel_size=(5, 5), sigmaX=0)# 显示原始图像和处理后的图像plt.figure(figsize=(8, 4))plt.subplot(1, 2, 1)plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))plt.title('Original Image')plt.axis('off')plt.subplot(1, 2, 2)plt.imshow(cv2.cvtColor(gaussian_filtered_image, cv2.COLOR_BGR2RGB))plt.title('Gaussian Filtered Image')plt.axis('off')plt.tight_layout()plt.show()if __name__ == "__main__":main()
(4) 锐化滤波器(Sharpening Filter)
锐化滤波器通过增强图像的边缘和细节来提高图像的清晰度。常用的锐化滤波器包括拉普拉斯算子和高通滤波器。
import cv2
import numpy as np
import matplotlib.pyplot as pltdef sharpen_filter(image, kernel_size=(3, 3), alpha=1.5):"""锐化滤波:param image: 输入图像:param kernel_size: 滤波器大小:param alpha: 锐化因子:return: 处理后的图像"""# 创建锐化滤波器kernel = np.array([[-1, -1, -1],[-1, 8, -1],[-1, -1,