图像直方图与频域变换实验报告

 

 

一、实验目的

 

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的版本匹配)等问题。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值