图像美化系统 — 系统汇报文档


一、系统概述

本系统是一个基于 Python + OpenCV + PyQt6 开发的数字图像处理实验平台,集成了图像预处理、几何变换、图像增强、特效美化、图像拼接与融合等核心功能。系统采用 Galaxy 深色科幻风格的图形用户界面,提供原图与处理结果的双窗口实时预览,交互直观,适合教学演示与实验验证。


二、技术栈

技术 用途
Python 3 主编程语言
OpenCV (cv2) 图像处理核心算法库
NumPy 矩阵运算与向量化处理
SciPy 频域变换(FFT)
PyQt6 图形界面框架
PyQt6-WebEngine 启动页 HTML 银河动画
CSS/QSS Galaxy 风格主题样式

三、系统架构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
project/
├── main.py # 程序入口
├── ui/
│ └── main_window.py # 主窗口(界面布局 + 所有槽函数)
├── processing/
│ ├── basic.py # 基础 I/O 与几何变换
│ ├── enhancement.py # 图像增强算法
│ ├── restoration.py # 噪声与滤波(空域/频域)
│ ├── effects.py # 美化特效
│ └── stitching.py # 拼接与融合
├── utils/
│ ├── helpers.py # OpenCV ↔ PyQt 图像格式互转
│ └── styles.py # Galaxy 主题 QSS 样式表
└── resources/
└── galaxy_panel.html # 启动页银河动画页面

设计模式:采用 MVC 分层架构processing/ 为模型层(纯算法),ui/ 为视图+控制层(GUI 交互),utils/ 为工具层。


四、界面设计

4.1 启动页(数字银河)

启动时显示全屏 Galaxy 风格的 HTML5 动画页面,用户点击 “进入数字银河” 按钮后,通过 QWebChannel 与 Python 后端通信,切换到主功能界面。

  • 使用 QWebEngineView 加载本地 HTML 页面
  • 使用 IntroBridge 类作为 JS ↔ Python 通信桥接
  • PyQt6-WebEngine 未安装,自动回退为静态欢迎卡片

4.2 主界面布局

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
┌──────────────────────────────────────────────────┐
│ 菜单栏:[文件] 打开图片 | 保存图片 │
├──────────┬───────────────────────────────────────┤
│ │ │
│ 功能 │ 原图预览 │
│ 选项卡 │ (QScrollArea + QLabel) │
│ │ │
│ ┌────┐ ├───────────────────────────────────────┤
│ │预处理│ │ │
│ │几何 │ │ 结果预览 │
│ │增强 │ │ (QScrollArea + QLabel) │
│ │美化 │ │ │
│ │拼接 │ │ │
│ │特殊 │ │ │
│ │操作 │ │ │
│ └────┘ │ │
│ │ │
└──────────┴───────────────────────────────────────┘
  • 左侧:功能选项卡(6个功能分组 + 1个操作分组)
  • 右侧:双窗口预览,使用 QSplitter 上下分割,支持拖拽调节比例

4.3 Galaxy 主题样式

整体采用深色科幻风 QSS 样式表(utils/styles.py),包括:

  • 深蓝紫渐变背景
  • 霓虹粉紫色调高亮
  • 圆角卡片式容器
  • 渐变色重点按钮(紫→粉)
  • 自定义滑块和选项卡样式

五、功能模块详解

5.1 基础 I/O 与几何变换(processing/basic.py

📁 实现文件: processing/basic.py | 🖥️ UI 调用: ui/main_window.py

5.1.1 图像读写

1
2
3
4
5
6
7
8
9
def read_image(file_path):
# 使用 np.fromfile + cv2.imdecode 支持中文路径
img = cv2.imdecode(np.fromfile(file_path, dtype=np.uint8), cv2.IMREAD_UNCHANGED)
return img

def save_image(img, file_path):
# 使用 cv2.imencode + tofile 支持中文路径保存
is_success, im_buf_arr = cv2.imencode(f".{ext}", img)
im_buf_arr.tofile(file_path)

技术要点:OpenCV 的 imread/imwrite 不支持中文路径,因此使用 NumPy 的 fromfile + imdecode / imencode + tofile 方案绕过此限制。

5.1.2 色彩转换

功能 实现方法 实现位置
彩色转灰度 cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) processing/basic.py L28-32 to_gray()
灰度转二值 先转灰度 → cv2.threshold(..., cv2.THRESH_BINARY) processing/basic.py L34-38 to_binary()

5.1.3 几何变换

功能 实现方法 关键参数 实现位置
旋转 cv2.getRotationMatrix2D + cv2.warpAffine 自动扩展画布防止裁剪 processing/basic.py L40-52 rotate_image()
水平镜像 cv2.flip(img, 1) flip_code: 1=水平, 0=垂直, -1=两者 processing/basic.py L54-56 flip_image()
中心裁剪 计算 h//4, w//4, h//2, w//2 区域 裁剪图像中心 50% 区域 processing/basic.py L62-64 crop_image()

旋转算法详解

1
2
3
4
5
6
7
8
9
10
11
12
def rotate_image(img, angle):
(h, w) = img.shape[:2]
center = (w // 2, h // 2)
M = cv2.getRotationMatrix2D(center, angle, 1.0)
# 计算旋转后所需的新画布尺寸
cos = np.abs(M[0, 0]); sin = np.abs(M[0, 1])
nW = int((h * sin) + (w * cos))
nH = int((h * cos) + (w * sin))
# 调整变换矩阵的平移分量
M[0, 2] += (nW / 2) - center[0]
M[1, 2] += (nH / 2) - center[1]
return cv2.warpAffine(img, M, (nW, nH))

5.2 噪声与滤波(processing/restoration.py

📁 实现文件: processing/restoration.py | 🖥️ UI 调用: ui/main_window.py L444-462

5.2.1 噪声生成

噪声类型 实现方法 实现位置
高斯噪声 np.random.normal(mean, sigma, img.shape) 叠加到原图 processing/restoration.py L5-8 add_gaussian_noise()
椒盐噪声 随机矩阵生成,阈值判断置0或255 processing/restoration.py L10-14 add_salt_pepper_noise()

5.2.2 空域滤波

滤波类型 OpenCV 函数 特点 实现位置
均值滤波 cv2.blur(img, (ksize, ksize)) 简单平滑,去噪但模糊边缘 processing/restoration.py L17-26 spatial_filter(method='mean')
中值滤波 cv2.medianBlur(img, ksize) 有效去除椒盐噪声,保边缘 processing/restoration.py L17-26 spatial_filter(method='median')
高斯滤波 cv2.GaussianBlur(img, (ksize, ksize), 0) 权重平滑,符合自然退化模型 processing/restoration.py L17-26 spatial_filter(method='gaussian')

5.2.3 频域滤波

📍 实现位置: processing/restoration.py L29-68 frequency_filter()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def frequency_filter(img, filter_type, method, radius):
# 1. FFT 变换到频域
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f) # 低频移到中心

# 2. 构造滤波器掩膜(理想/高斯)
mask = create_filter_mask(shape, filter_type, method, radius)

# 3. 频域相乘
fshift_filtered = fshift * mask

# 4. 逆 FFT 回到空域
img_back = np.fft.ifft2(np.fft.ifftshift(fshift_filtered))
return np.abs(img_back)

技术要点

  • 彩色图逐通道分别进行频域处理
  • 支持理想滤波器(硬截断)和高斯滤波器(平滑过渡)两种掩膜
  • 支持低通(平滑去噪)和高通(边缘增强)两种模式

5.2.4 伪彩色与假彩色增强

增强类型 实现方法 原理 实现位置
伪彩色 cv2.applyColorMap(img, cv2.COLORMAP_JET) 将灰度值映射到彩色空间(JET 热力图) processing/restoration.py L70-74 pseudo_color()
假彩色 交换 BGR 通道顺序为 RGB 人为改变颜色通道顺序,突出特定目标 processing/restoration.py L76-88 false_color()

5.3 图像增强(processing/enhancement.py

📁 实现文件: processing/enhancement.py | 🖥️ UI 调用: ui/main_window.py L479-486, L531-537

5.3.1 直方图均衡化

📍 实现位置: processing/enhancement.py L4-12 histogram_equalization()

1
2
3
4
5
6
7
8
def histogram_equalization(img):
if len(img.shape) == 2:
return cv2.equalizeHist(img) # 灰度图直接均衡化
else:
# 彩色图:转换到 YCrCb 空间,仅对亮度通道均衡化
ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)
ycrcb[:, :, 0] = cv2.equalizeHist(ycrcb[:, :, 0])
return cv2.cvtColor(ycrcb, cv2.COLOR_YCrCb2BGR)

设计考量:不在 RGB 空间直接均衡化,而是在 YCrCb 空间仅处理亮度(Y)通道,避免产生色彩失真。

5.3.2 亮度与对比度调节

📍 实现位置: processing/enhancement.py L14-23 adjust_brightness_contrast()

使用公式:$g(x) = \alpha \cdot f(x) + \beta$

  • $\alpha$(对比度系数):$(contrast + 100) / 100$,范围 $[0, 2]$
  • $\beta$(亮度偏移):$[-100, 100]$
  • 实现:cv2.convertScaleAbs(img, alpha=alpha, beta=beta)

交互设计:亮度与对比度各用一条 QSlider 控制,滑块值变化时实时更新预览。

5.3.3 Gamma 校正

📍 实现位置: processing/enhancement.py L38-41 gamma_correction()

$$I_{out} = 255 \times \left(\frac{I_{in}}{255}\right)^{1/\gamma}$$

使用 cv2.LUT 查找表加速,避免逐像素计算。

5.3.4 超分辨率(轻量版)

📍 实现位置: processing/enhancement.py L43-49 super_resolution_simple()

  • 2x 放大:cv2.resize(img, (w*2, h*2), interpolation=cv2.INTER_CUBIC)
  • 后处理锐化:拉普拉斯核 [[-1,-1,-1],[-1,9,-1],[-1,-1,-1]]

5.3.5 旧照片修复

📍 实现位置: processing/enhancement.py L51-58 old_photo_repair()

三步流水线:中值滤波去噪 → 直方图均衡化增强 → 锐化核滤波


5.4 美化特效(processing/effects.py

📁 实现文件: processing/effects.py | 🖥️ UI 调用: ui/main_window.py L488-510

5.4.1 浮雕效果

📍 实现位置: processing/effects.py L61-66 emboss_effect()

使用 Sobel 类卷积核提取图像梯度,加上 128 偏移使结果居中:

1
2
3
kernel = [[-2, -1, 0],
[-1, 1, 1],
[ 0, 1, 2]]

cv2.filter2D 卷积后 +128 并 clip 到 [0, 255]。

5.4.2 毛玻璃效果(向量化优化)

原版毛玻璃需要逐像素随机偏移采样,性能极差。本实现使用 NumPy 向量化

1
2
3
4
5
offsets = np.random.randint(0, sz, size=(h-sz, w-sz))  # 随机偏移矩阵
y, x = np.ogrid[:h-sz, :w-sz] # 网格索引
target_y = y + offsets
target_x = x + offsets
out[:h-sz, :w-sz] = img[target_y, target_x] # 一步完成所有像素的随机采样

5.4.3 倒影效果

  • 垂直翻转原图 → 生成渐变蒙版(从 1 到 0 的线性渐变)
  • 将翻转图像乘以蒙版 → 纵向拼接原图和渐隐倒影

5.4.4 边框添加

使用 cv2.copyMakeBorder 添加常量边框,颜色为深蓝紫色 #1E293B

5.4.5 简单拼图

支持自定义行列布局,自动将图像统一尺寸后拼接,兼容灰度与彩色混排。

5.4.6 铅笔画效果

调用 OpenCV 内置的 cv2.pencilSketch,参数 sigma_s=60, sigma_r=0.07, shade_factor=0.05


5.5 图像拼接与融合(processing/stitching.py

5.5.1 SIFT 特征匹配拼接

1
2
3
流程:
SIFT 特征检测 → BF 匹配 → KNN 比例测试(0.75)
→ RANSAC 单应性矩阵 → 透视变换 → 画布拼接
  • 使用 cv2.SIFT_create() 提取尺度不变特征
  • cv2.BFMatcher + knnMatch(k=2) 进行暴力匹配
  • Lowe’s ratio test:最近邻距离/次近邻距离 < 0.75 保留
  • cv2.findHomography(..., cv2.RANSAC, 5.0) 鲁棒估计单应性矩阵
  • 匹配点不足 10 个时返回 None 并提示用户

5.5.2 OpenCV 内置拼接

作为备用方案,调用 cv2.Stitcher_create().stitch(imgs)

5.5.3 线性融合(Alpha Blending)

$$I_{blend} = \alpha \cdot I_1 + (1-\alpha) \cdot I_2$$

使用 cv2.addWeighted,$\alpha = 0.5$ 为默认等权融合。

5.5.4 拉普拉斯金字塔融合(多频段融合)

1
2
3
4
5
流程:
1. 构建高斯金字塔(6层)
2. 从高斯金字塔构建拉普拉斯金字塔
3. 每层左右各半合并
4. 从顶层逐层重建图像

原理:在不同频段分别融合,低频(整体色调)和高频(细节纹理)分开处理,比直接线性融合更加自然。


5.6 图像格式转换工具(utils/helpers.py

OpenCV 使用 BGR 色彩顺序,PyQt 使用 RGB,因此需要格式转换:

函数 方向 处理
cv2_to_qpixmap OpenCV → PyQt 灰度图→Format_Grayscale8,BGR→RGB 后→Format_RGB888
qpixmap_to_cv2 PyQt → OpenCV RGB→BGR 逆转换

六、交互设计亮点

6.1 效果叠加机制

系统维护三个图像状态:

  • original_img:刚打开时的原始图像(不可变)
  • current_img:当前基准图像(供后续操作使用)
  • processed_img:当前处理结果(右侧预览)

用户点击 “确认应用当前效果” 后,processed_img 覆盖 current_img,后续操作在已有效果上叠加。点击 “重置为原图” 可将 current_img 恢复为 original_img

6.2 实时预览

亮度和对比度调节使用 QSlider.valueChanged 信号实时触发处理,无需额外点击。

6.3 自适应缩放

resizeEvent 中调用 display_images(),窗口大小变化时自动重新缩放预览图像,保持 KeepAspectRatio 比例。


七、功能清单汇总

编号 功能分类 具体功能 状态 实现位置
1 基础 I/O 图像读取(BMP/JPG/PNG,支持中文路径) processing/basic.py L4-14 read_image()
2 基础 I/O 图像保存 processing/basic.py L16-26 save_image()
3 色彩转换 彩色转灰度 processing/basic.py L28-32 to_gray()
4 色彩转换 灰度转二值 processing/basic.py L34-38 to_binary()
5 几何变换 旋转(仿射变换,自动扩展画布) processing/basic.py L40-52 rotate_image()
6 几何变换 水平镜像/垂直翻转 processing/basic.py L54-56 flip_image()
7 几何变换 中心裁剪 processing/basic.py L62-64 crop_image()
8 噪声 高斯噪声 processing/restoration.py L5-8 add_gaussian_noise()
9 噪声 椒盐噪声 processing/restoration.py L10-14 add_salt_pepper_noise()
10 空域滤波 中值滤波 processing/restoration.py L17-26 spatial_filter()
11 频域滤波 频域低通滤波(理想/高斯) processing/restoration.py L29-68 frequency_filter()
12 伪彩色/假彩色 伪彩色增强(JET Colormap) processing/restoration.py L70-74 pseudo_color()
13 伪彩色/假彩色 假彩色增强(通道重排) processing/restoration.py L76-88 false_color()
14 图像增强 直方图均衡化(YCrCb 空间) processing/enhancement.py L4-12 histogram_equalization()
15 图像增强 亮度调节(实时滑块) processing/enhancement.py L14-23 adjust_brightness_contrast()
16 图像增强 对比度调节(实时滑块) processing/enhancement.py L14-23 adjust_brightness_contrast()
17 图像增强 Gamma 校正 processing/enhancement.py L38-41 gamma_correction()
18 美化特效 浮雕效果 processing/effects.py L61-66 emboss_effect()
19 美化特效 毛玻璃效果(向量化优化) processing/effects.py L68-79 frosted_glass_effect()
20 美化特效 倒影效果(渐变蒙版) processing/effects.py L81-92 reflection_effect()
21 美化特效 添加边框 processing/effects.py L25-34 add_frame()
22 美化特效 简单拼图(支持彩色+灰度混排) processing/effects.py L36-59 simple_jigsaw()
23 拼接融合 SIFT 特征匹配拼接 processing/stitching.py L20-55 stitch_images_feature()
24 拼接融合 线性融合(Alpha Blending) processing/stitching.py L57-63 alpha_blending()
25 拼接融合 拉普拉斯金字塔融合 processing/stitching.py L65-103 pyramid_blending()
26 特殊功能 超分辨率 2x(插值+锐化) processing/enhancement.py L43-49 super_resolution_simple()
27 特殊功能 旧照片修复(去噪+增强+锐化) processing/enhancement.py L51-58 old_photo_repair()
28 交互 效果叠加/重置 ui/main_window.py L539-547 confirm_effect() / reset_image()
29 交互 双窗口实时预览 ui/main_window.py L420-434 display_images() / render_preview()
30 UI Galaxy 深色主题 utils/styles.py L1 get_galaxy_style()
31 UI 数字银河启动动画 ui/main_window.py L129-161 build_launch_page() + resources/galaxy_panel.html

八、运行方式

1
2
3
4
5
# 安装依赖
pip install -r requirements.txt

# 运行程序
python main.py

依赖项requirements.txt):

  • opencv-python
  • numpy
  • scipy
  • PyQt6
  • PyQt6-WebEngine(可选,用于启动页银河动画)

九、总结

本系统完整实现了数字图像处理课程的核心实验要求,覆盖了预处理、几何变换、增强、美化、拼接五大功能模块,共计 31 项具体功能。系统采用模块化架构设计,图像处理算法与界面逻辑分离。界面设计采用 Galaxy 主题风格,视觉效果突出,交互体验流畅。

技术特色

  • 中文路径兼容方案
  • YCrCb 色彩空间的直方图均衡化避免色偏
  • 毛玻璃效果的向量化加速实现
  • SIFT + RANSAC 鲁棒图像拼接
  • 拉普拉斯金字塔多频段融合
  • 效果叠加机制支持流水线式处理