一、实验目的
- 掌握数字图像处理关于图像增强的概念、分类以及基本内容;
- 掌握基于一二阶微分算子的图像空域增强的操作方法(比如Roberts、Prewitt和Sobel算子、拉普拉斯算子等);
- 掌握图像频域增强的操作流程和实现方法(低通、高通、带阻和带通滤波等)
- 掌握Python环境下图像空域增强(直方图均衡化)和频域增强算法的典型实现。
- 熟练掌握图像直方图概念,掌握直方图均衡化方法对图像空间增强的实现,了解其在医学图像处理中的应用。
- 熟练掌握对图像进行空间滤波,了解空间滤波技术在人像美颜中的应用。
二、实验内容
- 读取一幅灰度图像并进行显示,对其采用一种一二阶微分算子(比如Roberts、Prewitt和Sobel算子、拉普拉斯算子中的一种)实现对图像的空域增强算法,并进行显示;通过前后图像对比,分析该算子对图像增强的作用。
- 读取并显示一幅灰度图像,对其进行傅里叶变换,获取并显示该图像的频谱图,然后调用低通滤波函数进行滤波,最后再通过傅里叶逆变换恢复并显示滤波后图像,对滤波后图像进行dft变换,显示滤波后图像的dft频谱图。(注意该过程要求显示的各图像)
- 实例应用题:读取一幅医学图像bone1.tif,对其采用直方图均衡化法进行图像增强,对比操作前后的图像和直方图,请分析直方图均衡化用于图像增强应用的效果。
说明:bone1.tif是一张人体正面骨架的X光片,直观感受图像整体发暗,细节缺失严重。通过查看其灰度直方图,发现大部分像素集中在低灰度值。本案例尝试通过直方图均衡化改善该图片的成像效果。 - 实例应用题:图像空间滤波是当下大部分美颜软件的核心技术模块。
本案例对美颜功能中的美白特效进行技术解密:图像空间滤波如何应用于美颜相机。试如下操作:读取一幅人像图片meiyan.png,通过采用图像空间滤波操作(双边滤波+高斯滤波)实现简单的雀斑美颜功能,并对比美颜前后的图像。
三、完整实验程序、结果与分析
代码:
1.
结果与分析:
-
通过Sobel算子计算梯度幅值,与原图加权融合,突出边缘信息,增强图像轮廓,改善细节表现。
-
使用理想低通滤波器保留低频分量,去除高频噪声,图像变得模糊,实现平滑效果。
-
将集中分布的灰度值重新均匀分布,提升医学图像对比度,使骨骼细节更清晰可见。
-
双边滤波在平滑皮肤同时保留边缘特征,高斯滤波进一步柔化皮肤,实现自然的美白效果。
四、本次作业中出现的问题及心得
通过本次实验,我系统掌握了数字图像增强的核心方法与实现流程。在空域增强方面,运用Sobel算子验证了一阶微分对边缘特征的强化效果,理解了梯度计算如何提升图像锐度与细节表现;通过直方图均衡化实践,直观体会到像素灰度重分布对医学图像对比度的改善机制,尤其在处理低对比X光片时,均衡化使骨骼纹理显著清晰。在频域处理中,傅里叶变换与低通滤波的实现让我认识到频域分离对图像平滑与噪声抑制的作用,频谱图对比揭示了高低频分量与图像特征的关联性。
实验也暴露出理论与实践衔接的挑战:例如微分算子对噪声敏感,需权衡边缘增强与噪声放大;频域滤波中截止频率的选择直接影响细节保留程度;双边滤波参数调节需反复试验才能平衡美颜效果与自然度。这些问题的解决深化了我对算法原理的理解,并意识到实际应用中需结合先验知识进行参数优化。本次实验不仅强化了图像处理的核心技能,更培养了工程实践中“分析-调试-验证”的闭环思维。
完整代码
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 1. 一阶微分算子增强(Sobel算子)
def task1():
img = cv2.imread('D:/tuxiang/people.jpg', 0) # 替换为你的图像路径
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
sobel = cv2.magnitude(sobelx, sobely)
enhanced = cv2.addWeighted(img, 0.7, cv2.convertScaleAbs(sobel), 0.3, 0)
plt.figure(figsize=(12, 6))
plt.subplot(121), plt.imshow(img, cmap='gray'), plt.title('原始图像')
plt.subplot(122), plt.imshow(enhanced, cmap='gray'), plt.title('Sobel增强后')
plt.show()
# 2. 傅里叶变换与低通滤波
def task2():
img = cv2.imread('D:/tuxiang/cat.jpg', 0)
# 傅里叶变换
dft = np.fft.fft2(img)
dft_shift = np.fft.fftshift(dft)
magnitude = 20 * np.log(np.abs(dft_shift))
# 创建低通滤波器
rows, cols = img.shape
crow, ccol = rows // 2, cols // 2
mask = np.zeros((rows, cols), np.uint8)
r = 30 # 截止频率
mask[crow - r:crow + r, ccol - r:ccol + r] = 1
# 应用滤波器并逆变换
fshift = dft_shift * mask
f_ishift = np.fft.ifftshift(fshift)
img_back = np.fft.ifft2(f_ishift)
img_back = np.abs(img_back).astype(np.uint8)
# 滤波后的频谱
dft2 = np.fft.fft2(img_back)
dft_shift2 = np.fft.fftshift(dft2)
magnitude2 = 20 * np.log(np.abs(dft_shift2) + 1)
plt.figure(figsize=(15, 10))
plt.subplot(231), plt.imshow(img, cmap='gray'), plt.title('原始图像')
plt.subplot(232), plt.imshow(magnitude, cmap='gray'), plt.title('原始频谱')
plt.subplot(233), plt.imshow(mask, cmap='gray'), plt.title('低通滤波器')
plt.subplot(234), plt.imshow(img_back, cmap='gray'), plt.title('滤波后图像')
plt.subplot(235), plt.imshow(magnitude2, cmap='gray'), plt.title('滤波后频谱')
plt.show()
# 3. 直方图均衡化
def task3():
img = cv2.imread('D:/tuxiang/bone1.tif', 0)
equ = cv2.equalizeHist(img)
plt.figure(figsize=(15, 6))
plt.subplot(221), plt.imshow(img, cmap='gray'), plt.title('原始医学图像')
plt.subplot(222), plt.imshow(equ, cmap='gray'), plt.title('均衡化后图像')
plt.subplot(223), plt.hist(img.ravel(), 256, [0, 256]), plt.title('原始直方图')
plt.subplot(224), plt.hist(equ.ravel(), 256, [0, 256]), plt.title('均衡化直方图')
plt.tight_layout()
plt.show()
# 4. 美颜滤镜
def task4():
img = cv2.cvtColor(cv2.imread('D:/tuxiang/meiyan.png'), cv2.COLOR_BGR2RGB)
# 双边滤波(保留边缘)+ 高斯滤波
bilateral = cv2.bilateralFilter(img, d=9, sigmaColor=75, sigmaSpace=75)
gaussian = cv2.GaussianBlur(bilateral, (5, 5), 0)
plt.figure(figsize=(12, 6))
plt.subplot(121), plt.imshow(img), plt.title('原始人像')
plt.subplot(122), plt.imshow(gaussian), plt.title('美颜处理后')
plt.show()
# 执行所有任务
if __name__ == "__main__":
task1()
task2()
task3()
task4()