一、实验目的
1. 掌握图像灰度变换原理,理解点运算对图像灰度的调整机制。
2. 理解图像直方图均衡化算法,掌握其在图像对比度增强中的应用。
3. 了解图像频域变换(以傅里叶变换为代表),学会观察和分析频谱图。
二、实验原理
1. 图像灰度变换
灰度变换是对图像中每个像素的灰度值进行点运算,通过线性或非线性函数调整灰度分布,实现对比度增强、亮度调整等效果。
2. 直方图均衡化
直方图均衡化通过灰度概率分布的变换,将原始图像的直方图拉伸为近似均匀分布的直方图,从而增强图像对比度。
3. 图像频域变换(傅里叶变换)
傅里叶变换将图像从空间域转换到频率域,将图像表示为不同频率的正弦和余弦分量的叠加。
三、实验内容与实现步骤
1. 图像灰度变换(点运算)
步骤:
- 读取原始灰度图像。
- 定义灰度变换函数,设置 \alpha(对比度系数)和 \beta(亮度偏移量)。
- 对图像每个像素执行 g = \alpha \cdot f + \beta 运算,并将结果像素值限制在 [0,255] 范围内。
- 显示原始图像和变换后的图像。
2. 图像直方图的显示
步骤:
- 利用 cv2.calcHist 函数计算图像灰度直方图。
- 使用 matplotlib 绘制直方图,设置横轴为灰度级(0-255),纵轴为像素数量。
3. 直方图均衡化
步骤:
- 调用OpenCV内置函数 cv2.equalizeHist 对图像进行直方图均衡化。
- 显示均衡化后的图像,并绘制其直方图。
4. 图像频域变换(傅里叶变换)
步骤:
- 对图像进行快速傅里叶变换(FFT),并通过 np.fft.fftshift 将频谱中心移到图像中心。
- 计算频谱的幅度谱(取对数缩放以便观察),并显示频谱图。
代码实现:
import cv2
import numpy as np
import matplotlib.pyplot as plt
# ---------------------- 1. 图像灰度变换 ----------------------
def gray_transform(img):
# 线性灰度变换(对比度增强)
alpha = 1.5 # 对比度系数
beta = 20 # 亮度偏移
transformed = np.clip(alpha * img + beta, 0, 255).astype(np.uint8)
return transformed
# ---------------------- 2. 图像直方图显示 ----------------------
def show_histogram(img, title):
hist = cv2.calcHist([img], [0], None, [256], [0, 256])
plt.figure(figsize=(6, 4))
plt.plot(hist, color='gray')
plt.title(title)
plt.xlabel('灰度级')
plt.ylabel('像素数量')
plt.show()
# ---------------------- 3. 直方图均衡化 ----------------------
def histogram_equalization(img):
equalized = cv2.equalizeHist(img)
return equalized
# ---------------------- 4. 图像频域变换(傅里叶变换) ----------------------
def frequency_transform(img):
f = np.fft.fft2(img)
f_shift = np.fft.fftshift(f)
magnitude_spectrum = 20 * np.log(np.abs(f_shift) + 1) # 频谱图(对数缩放以便观察)
return magnitude_spectrum
# ---------------------- 主函数 ----------------------
if __name__ == "__main__":
# 读取图像(灰度模式)
img = cv2.imread('your_image.jpg', 0) # 替换为你的图像路径
# 1. 灰度变换
transformed_img = gray_transform(img)
cv2.imshow('Original Image', img)
cv2.imshow('Gray Transformed Image', transformed_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 2. 显示原始图像直方图
show_histogram(img, 'Original Histogram')
# 3. 直方图均衡化
equalized_img = histogram_equalization(img)
cv2.imshow('Equalized Image', equalized_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 4. 显示均衡化后直方图
show_histogram(equalized_img, 'Equalized Histogram')
# 5. 频域变换(显示频谱图)
spectrum = frequency_transform(img)
plt.figure(figsize=(6, 4))
plt.imshow(spectrum, cmap='gray')
plt.title('Frequency Spectrum')
plt.axis('off')
plt.show()
四、实验结果与分析
1. 图像灰度变换结果
- 当设置 \alpha=1.5、\beta=20 时,图像对比度增强且亮度提升,暗部细节更清晰。
- 若调整 \alpha=0.8、\beta=-10,图像对比度降低且亮度变暗,可用于模拟低对比度场景。
2. 直方图均衡化结果
- 原始图像直方图可能集中在某一灰度区间,均衡化后直方图分布更均匀,图像对比度显著增强。
- 对于本身对比度较高的图像,均衡化可能导致部分细节过曝,需根据场景选择是否使用。
3. 频域变换结果
- 频谱图中,中心区域对应低频分量(图像整体亮度、大轮廓),边缘区域对应高频分量(图像细节、边缘)。
- 若图像存在周期性噪声,频谱图中会出现明显的离散亮点,可通过频域滤波去除。


五、实验总结
通过本次实验,掌握了图像灰度变换、直方图均衡化和频域变换的原理与实现方法:
- 灰度变换是图像增强的基础手段,可灵活调整图像对比度和亮度。
- 直方图均衡化是经典的对比度增强算法,适用于大多数场景但需注意过增强问题。
- 频域变换为图像分析和滤波提供了新视角,频谱图的观察有助于理解图像的频率构成。
在实验过程中,需注意图像路径的正确性、库版本的兼容性(如NumPy、OpenCV、Matplotlib的版本匹配)等问题。
724

被折叠的 条评论
为什么被折叠?



