### 直方图均衡化原理及MATLAB实现
#### 实验背景
数字图像处理作为计算机视觉领域的基础之一,在模式识别、图像分析等多个方面发挥着重要作用。直方图均衡化是一种常用的图像增强技术,用于改善图像对比度,从而使图像更加清晰。本实验旨在通过MATLAB编程实践,帮助学生深入理解直方图均衡化的原理与应用。
#### 实验目标
1. **掌握直方图均衡化的原理与步骤**:理解直方图均衡化的基本概念及其如何通过改变图像的灰度分布来提高图像对比度。
2. **了解直方图均衡化的效果**:通过实验观察直方图均衡化前后图像的变化,理解其对图像质量的影响。
#### 实验要求
- **实现任意图像的直方图均衡化**:编写MATLAB程序,能够对输入的任意图像执行直方图均衡化处理,并展示处理前后的图像及其直方图。
#### 实验步骤详解
1. **读取原始图像**:使用`imread()`函数读取图像文件,并使用`rgb2gray()`将其转换为灰度图像。
```matlab
A = imread('img.jpg');
PS = rgb2gray(A);
figure, imshow(PS); title('原始图');
```
2. **统计原始图像的灰度直方图**:计算每个灰度级别的像素数量,并计算各灰度级别的相对频率。
```matlab
[m, n] = size(PS);
GP = zeros(1, 256);
for k = 0:255
GP(k+1) = length(find(PS == k)) / (m * n);
end
figure, bar(0:255, GP, 'g');
title('原图像直方图');
xlabel('灰度值');
ylabel('出现概率');
```
3. **计算累积分布函数(CDF)**:累积分布函数表示小于或等于某灰度级别的像素所占的比例。
```matlab
S1 = zeros(1, 256);
for i = 1:256
for j = 1:i
S1(i) = GP(j) + S1(i);
end
end
```
4. **映射新的灰度值**:将累积分布函数的值映射到0至255之间,以得到均衡化后的灰度值。
```matlab
S2 = round((S1 * 256) + 0.5);
```
5. **生成均衡化后的图像**:用映射后的灰度值替换原始图像的像素值。
```matlab
for i = 1:256
GPE(i) = sum(GP(find(S2 == i)));
end
figure, bar(0:255, GPE, 'b');
title('均衡化后的直方图');
xlabel('灰度值');
ylabel('出现概率');
```
#### 实验结果与讨论
- **原始图像与均衡化后的图像对比**:观察并对比两幅图像,可以明显看到均衡化后的图像对比度更高,细节更丰富。
- **直方图变化**:对比均衡化前后图像的直方图,可以看到均衡化后的直方图分布更加均匀,这表明像素值被更广泛地分布在了整个灰度范围内。
#### 实验总结
通过本次实验,不仅掌握了直方图均衡化的原理与实现方法,还深刻理解了其在实际应用中的作用。虽然直方图均衡化能有效提高图像的对比度,但在某些情况下可能会导致图像的某些细节信息丢失。因此,在具体应用时需要根据实际情况灵活选择是否采用该技术。
#### 实验评语
通过本次实验,学生展示了良好的理论知识与编程实践能力,对直方图均衡化的理解较为透彻。希望在未来的学习中能够继续探索更多图像处理技术,不断提升自己的专业技能。