【Python】图像离散余弦变换与直方图增强综合实验报告
一、实验目的及原理:
1.目的:
- 掌握图像灰度变换原理,能通过编程实现不同的灰度变换操作以调整图像视觉效果。
- 理解图像直方图均衡化算法,明确其在增强图像对比度、提升图像细节表现力方面的作用,并能编程实现。
- 了解图像频域变换(以傅里叶变换为代表),学会观察频谱图以分析图像的频率成分分布。
-
2.技术方法与算法原理:
-
图像灰度变换:属于点运算,对图像每个像素的灰度值按特定函数进行变换。
图像直方图均衡化:直方图反映图像灰度分布。该算法通过累积分布函数(CDF)将原始灰度值映射到新的灰度值,使直方图趋于均匀分布。
图像频域变换(傅里叶变换):将图像从空间域转换到频域,傅里叶变换结果的幅度谱(频谱图)反映图像频率信息,低频对应图像整体灰度和缓慢变化部分,高频对应边缘、细节等快速变化部分。
-
二、程序代码
-
-
- 了解图像频域变换(以傅里叶变换为代表),学会观察频谱图以分析图像的频率成分分布。
- 理解图像直方图均衡化算法,明确其在增强图像对比度、提升图像细节表现力方面的作用,并能编程实现。
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 定义高斯噪声生成函数
def GaussianNoise(img, mu, sigma):
"""生成均值为mu、方差为sigma的高斯噪声并叠加到图像上"""
h, w = img.shape[:2]
noise = np.random.normal(mu, sigma, (h, w)) # 生成高斯噪声
noisy_img = img + noise
return np.clip(noisy_img, 0, 255).astype(np.uint8) # 确保像素值在有效范围
# 读取原始图像(灰度图)
img = cv2.imread('test.jpg', 0)
if img is None:
raise ValueError("无法读取图像,请检查路径")
# 1. 线性变换:img1 = a*img + b(示例a=1.0, b=50)
a = 1.0
b = 50
img1 = cv2.add(cv2.multiply(a, img.astype(np.float32)), b).astype(np.uint8)
# 2. 幂次变换:temp = img^0.1(注意输入需为浮点型且非负)
img_float = img.astype(np.float32) / 255.0 # 归一化到[0,1]
temp = cv2.pow(img_float, 0.1)
temp = (temp * 255).astype(np.uint8) # 转回[0,255]
# 3. 多次叠加高斯噪声并求平均(抑制噪声)
k = np.zeros_like(img, dtype=np.float32)
for i in range(100):
j = GaussianNoise(img, 0, 0.05 * 255) # 噪声方差对应0.05(以255为基准)
k += j
k = (k / 100).astype(np.uint8) # 平均后转回uint8
# 4. 生成带噪声图像并计算噪声残差
img_norm = img.astype(np.float32) / 255.0 # 归一化
img_n = GaussianNoise(img_norm, 0.1, 0.05) # 叠加均值0.1、方差0.05的噪声
K = img_n - img_norm # 噪声残差
# 5. 乘法运算:img1 = 1.2 * img
img1_mul = cv2.multiply(1.2, img.astype(np.float32)).astype(np.uint8)
# 6. 除法运算:img1 = img / 2
img1_div = cv2.divide(img.astype(np.float32), 2).astype(np.uint8)
# 7. 计算直方图
hist = cv2.calcHist([img], [0], None, [256], [0, 255])
# 8. 傅里叶变换与逆变换
img_dft = cv2.dft(img_norm, flags=cv2.DFT_COMPLEX_OUTPUT) # DFT变换(复数输出)
img_cen = np.fft.fftshift(img_dft) # 中心频移
img_s = cv2.idft(img_dft) # IDFT逆变换
# 计算频谱(模值)
img_dft_mag = cv2.magnitude(img_dft[:, :, 0], img_dft[:, :, 1])
img_cen_mag = cv2.magnitude(img_cen[:, :, 0], img_cen[:, :, 1])
img_s_mag = cv2.magnitude(img_s[:, :, 0], img_s[:, :, 1])
# 频谱归一化便于显示
img_dft_mag = (img_dft_mag / np.max(img_dft_mag) * 255).astype(np.uint8)
img_cen_mag = (img_cen_mag / np.max(img_cen_mag) * 255).astype(np.uint8)
img_s_mag = (img_s_mag / np.max(img_s_mag) * 255).astype(np.uint8)
# 结果显示
def show_img(title, img, is_gray=True):
plt.figure()
plt.title(title)
if is_gray:
plt.imshow(img, cmap='gray')
else:
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.axis('off')
show_img('yuan', img)
show_img('xianxing(a=1.0, b=50)', img1)
show_img('mici(γ=0.1)', temp)
show_img('pingjunyizhi', k)
show_img('zaoshengcancha', K, is_gray=False) # 残差可能为负值,用伪彩色显示
show_img('5. chengfa(×1.2)', img1_mul)
show_img('6. chufa(÷2)', img1_div)
# 显示直方图
plt.figure()
plt.plot(hist)
plt.title('zhifangtu')
plt.xlabel('huidu')
plt.ylabel('xiangsu')
# 显示傅里叶变换结果
show_img('DFT', img_dft_mag)
show_img('pianyihou', img_cen_mag)
show_img('8. IDFT', img_s_mag)
# DCT变换(输入需归一化到[0,1])
img_norm = img / 255.0 # 归一化
img_dct = cv2.dct(img_norm) # 离散余弦变换
img_idct = cv2.idct(img_dct) # 逆离散余弦变换
# 显示结果
plt.figure(figsize=(12, 4))
plt.subplot(131)
plt.imshow(img, cmap='gray')
plt.title('yuan')
plt.axis('off')
plt.subplot(132)
# 对DCT系数取对数增强可视化(避免0值问题)
dct_vis = 20 * np.log(np.abs(img_dct) + 1e-8) # 加1e-8防止log(0)
plt.imshow(dct_vis, cmap='gray')
plt.title('lisanyuxian')
plt.axis('off')
plt.subplot(133)
plt.imshow(img_idct, cmap='gray')
plt.title('nibianhuan')
plt.axis('off')
plt.tight_layout()
plt.show()
三、实验结果与分析
结果:
图像灰度变换能有效调整图像的对比度和亮度,本次线性变换后图像视觉效果更鲜明。
直方图均衡化使图像直方图更均匀,对比度显著提升,图像细节更清晰可辨。
傅里叶变换得到的频谱图能清晰展示图像的频率成分分布,中心为低频,周围为高频。
不足:
灰度变换仅采用了简单的线性变换,对于一些复杂光照条件下的图像,可能无法达到最佳效果;且没有尝试非线性灰度变换(如对数变换、幂次变换)来对比不同效果。
图像代数运算只进行了加法操作,没有尝试减法、乘法等其他代数运算,对代数运算在图像融合、差异检测等方面的应用探索不足。
频域变换仅进行了傅里叶变换及频谱图观察,没有基于频域进行进一步的滤波等操作,对频域处理图像的能力挖掘不够。
改进:
后续可增加多种非线性灰度变换的实验,根据不同图像特点选择合适的变换方式。
扩展图像代数运算的类型,结合具体应用场景(如图像融合)进行实验。
在频域变换基础上,尝试进行低通滤波、高通滤波等操作,观察对图像去噪、增强边缘等方面的效果。
-
个人收获与体会
通过本次实验,我对图像灰度变换、直方图均衡化和频域变换的理论知识有了更深入的理解,不再局限于书本上的公式,而是通过实际编程操作,看到了这些算法如何改变图像。在编写和调试代码的过程中,我熟悉了 OpenCV 库的相关函数,提高了自己的 Python 编程能力和对数字图像处理流程的把握。同时,在分析实验结果时,我学会了从视觉效果、数据分布(如直方图)等多个角度去评估图像处理算法的效果,也深刻体会到理论与实践相结合的重要性,为今后进一步学习更复杂的图像处理技术奠定了基础。
-
思考
直方图均衡化会使图像的直方图强制变得均匀,可能会过度增强某些区域,导致图像出现不自然的视觉效果,是否有更灵活的方法,既能增强对比度又能保留图像原有灰度分布的主要特征?
更多推荐




所有评论(0)