一、实验目的与要求
实验目的:
1.熟悉图像的表示及基本元素、通道操作;
2.掌握基本灰度图像变换方法;
3.掌握OpenCV计算机视觉库;
实验要求:
1. 实验提交文件为实验报告和相关程序代码,以压缩包的形式提交,命名规则为“学号数字+姓名+Task1”,如2023154099张三Task1;
2. 所有素材和参考材料需列明出处,实验报告中的图片和程序代码建议标注个人水印或标识信息:姓名,班级,学号信息;
二、实验内容与方法
实验内容:不调用库函数,自己动手编程实现图像的直方图均衡化,并与OpenCV的库函数进行效果对比分析;
三、实验步骤与过程
1.定义和公式
1.1灰度图像变换方法
灰度图像变换是指通过对图像的每个像素进行某种数学运算,改变其灰度级别的方法。常见的灰度图像变换方法包括线性变换、非线性变换、对数变换、幂次变换等。这些方法可以通过定义一个映射函数来将原始图像的像素灰度级别映射到新的像素灰度级别,从而实现灰度图像的变换。
而直方图均衡化是一种特定的灰度图像变换方法,旨在通过重新分布图像的像素灰度级别,使得图像的直方图在灰度级别上具有更均匀的分布。直方图均衡化通过计算图像的累积分布函数(CDF),并将原始图像的像素值映射为新的像素值,使得均衡化后的图像具有更广的动态范围和更好的对比度。
1.2直方图均衡化
2.图像直方图均衡化
2.1图像直方图均衡化公式推导
目标是将一幅图像的像素占有全部可能的灰度级且分布均匀,能够具有高对比度。
使用的方法是灰度级变换:
s=T(r)
基本思想是把原始图的直方图变换为均匀分布的形式,这样就增加了像素灰度值的动态范围从而达到增强图像整体对比度的效果。
2.2图像直方图均衡化流程图
1.读取图像:
使用Python的图像处理库读取待处理的图像,并将其转换为灰度图像。
2.计算直方图:
遍历灰度图像的每个像素,统计每个灰度级别的像素数量,得到原始图像的直方图。
3.计算累积分布函数(CDF):
对直方图进行归一化处理,计算每个灰度级别的累积分布函数。
4.映射像素值:
对于每个输入像素,使用CDF将其灰度级别映射为新的像素值,以实现均衡化。即将归一化的 sk乘以 L−1,再四舍五入,以使得均衡化后图像的灰度级与归一化前的原始图像一致。
5.构建均衡化后的图像:
遍历原始图像的每个像素,根据映射后的像素值构建均衡化后的图像。
2.3直方图均衡化实现
2.3.1伪代码
def histogram_equalization(image) |
# 1. 计算像素个数 total_pixels = image.shape[0] * image.shape[1] # 2. 计算灰度直方图 histogram = np.zeros(256, dtype=int) for i in range(image.shape[0]): for j in range(image.shape[1]): pixel_value = image[i, j] histogram[pixel_value] += 1 # 3. 计算分布概率 probability = histogram / total_pixels # 4. 计算累计分布概率 cdf = np.cumsum(probability) cdf_normalized = cdf * 255 # 5. 映射像素值 equalized_image = np.zeros_like(image) for i in range(image.shape[0]): for j in range(image.shape[1]): pixel_value = image[i, j] equalized_image[i, j] = cdf_normalized[pixel_value] return equalized_image |
3.结果对比
3.1直方图均衡化效果
3.2 OpenCV库函数效果
OpenCV库函数 |
equalized_image = cv2.equalizeHist(image) hist_equalized = cv2.calcHist([equalized_image], [0], None, [256], [0, 256]) |
3.3 与OpenCV库函数效果对比
分析:
两个方法实现的直方图均衡化结果差不多,都有效的实现了均衡化效果,但是总体来看,OpenCV的效果会更好,比如在下面这一部分OpenCV的优势比较明显。
原因:
查询OpenCV的特点时发现,它实现了优化的算法:OpenCV是一种专门用于计算机视觉任务的库,它在图像处理方面进行了高度的优化。除此之外,OpenCV库函数通常使用并行计算技术,可以利用多核处理器或图形处理器 (GPU) 进行加速。这种并行处理能力使得库函数能够同时处理多个像素或图像块,从而大大提高了直方图均衡化的处理速度。
在底层优化方面,OpenCV底层使用了优化的C/C++代码,以及针对不同硬件平台的优化指令集。这些优化可以提高算法的执行效率,使得直方图均衡化函数在处理图像时更加高效。
还有可能是直方图计算方式和累计分布概率计算方式不同。
四、实验结论或体会
结论:
OpenCV库函数的实现直方图均衡化效率更高。
心得体会:
本次实验中,我学习了解实践了直方图均衡化。技术上我通过手动编程实现图像直方图均衡化,加深了对图像处理算法的理解和掌握。了解了直方图的概念和计算方法,以及如何利用累积分布函数进行像素值映射。
操作上我进行图像直方图均衡化的操作,掌握了如何读取图片、如何计算像素点等,在实验过程中,学会使用了一些图像处理库或工具,例如NumPy用于数组计算、Matplotlib用于可视化等。
除此之外,我还通过实现直方图均衡化,深入理解了直方图均衡化算法的原理和作用。了解了如何通过调整像素值的分布来增强图像的对比度和亮度。与OpenCV的库函数进行对比分析,可以发现库函数的实现效率更高,但对于理解算法原理和自定义处理过程,手动实现更具有教育和学习意义。
图像直方图均衡化是一种简单但强大的图像处理技术,能够改善图像的视觉效果。通过手动编程实现直方图均衡化,不仅加深了对图像处理算法的理解,还提高了对图像处理库函数的使用理解。这个实验让我更加熟悉了图像的表示和基本元素,并掌握了基本的灰度图像变换方法。同时,通过与OpenCV库函数进行对比,也能够分析和评估不同方法的优缺点,为以后的图像处理任务提供更好的选择和决策。
五、思考题
尝试查找除直方图均衡化以外的图像增强方法,并简述其原理。
1.自适应直方图均衡化(Adaptive Histogram Equalization,AHE):
自适应直方图均衡化是一种在局部区域内进行直方图均衡化的方法,可以提高图像的对比度并保持局部细节。它将图像分成多个小块,然后在每个小块中进行直方图均衡化。
AHE: |
输入:图像I,块大小block_size 对于图像中的每个块(从左上角开始): 提取当前块(大小为block_size)的子图像 对子图像进行直方图均衡化 将均衡化后的子图像放回原图像的相应位置 输出:均衡化后的图像 |
2.对比度拉伸(Contrast Stretching):
对比度拉伸是一种通过线性变换来增加图像的对比度的方法。它将图像的像素值范围映射到更广的范围,从而增强图像的动态范围。
Contrast Stretching: |
输入:图像I,最低像素值min_value,最高像素值max_value 对于图像中的每个像素(x, y): 原始像素值 = I(x, y) 新的像素值 = (原始像素值 - min_value) * (255 / (max_value - min_value)) 将新的像素值限制在0到255之间 将新的像素值赋值给图像I的相应位置 输出:增强后的图像 |
3.双边滤波(Bilateral Filtering):
双边滤波是一种能够减少噪声的滤波方法,同时保留图像的边缘信息。它在滤波过程中考虑了像素之间的空间距离和灰度差异,以进行加权平均。
Bilateral Filtering: |
输入:图像I,滤波器参数sigma_s,滤波器参数sigma_r 对于图像中的每个像素(x, y): 计算滤波器权重: 权重 = exp(-((x - xi)^2 + (y - yi)^2) / (2 * sigma_s^2)) * exp(-((I(x, y) - I(xi, yi))^2) / (2 * sigma_r^2)) 计算加权平均: 像素值 = ∑(权重 * I(xi, yi)) / ∑权重 输出:滤波后的图像 |