整理这份《数字图像处理》复习资料时,最直观的感受是:这门课知识点不难,难的是把“图像增强、滤波、分割、形态学、压缩”等一堆概念串成体系。很多同学准备期末考试或考研复试时,习惯一章一章背,结果背到第七章,前面已经忘得差不多了。本文用一套“主线 + 高频考点 + 可复现代码”的方式,把整门课重新梳理一遍。内容围绕数字图像处理的核心概念、经典算法、实验复现和答题套路展开,适合正在准备期末考试、考研复试的人,也适合打算用 Python 快速回顾课程实验的开发者。文中的代码都是按实验思路组织的,环境版本不需要完全一致,重点是把原理落到实际结果上。
1. 复习为什么要抓主线:数字图像处理的课程框架
1.1 这门课到底在学什么?
很多同学第一遍上课时,会觉得《数字图像处理》就是“Photoshop 算法版”,老师今天讲滤波、明天讲分割,好像每一章都是独立的。实际上,数字图像处理有一条非常清晰的主线,可以概括为:
输入图像 → 预处理 → 增强与恢复 → 分割 → 特征提取 → 识别或压缩输出。
在这条主线里:
- 预处理包括灰度化、几何变换、图像去噪;
- 图像增强和图像恢复解决的是“让图像更清楚”的问题,但两者原理不同;
- 图像分割解决的是“把感兴趣目标从背景中分出来”的问题;
- 形态学处理通常用于分割后的二值图像后处理,比如去掉小噪点、连接断裂区域;
- 特征提取与描述是为了后续识别、分类或者匹配做准备;
- 图像压缩则是解决存储和传输问题。
期末考试和考研中,最容易出现的一类综合题就是:给一张带噪声的灰度图,让你设计一个处理流程,按顺序写清楚每一步用什么算法、为什么用这个算法以及预期结果。如果脑子里没有这条主线,这种题很容易丢步骤分。
1.2 教材与课程资源版本怎么选?
国内很多高校使用的教材是冈萨雷斯(Rafael C. Gonzalez)的《数字图像处理》,也就是很多同学搜索“冈萨雷斯数字图像处理 pdf”时想找的那本。不同学校中文版可能用第三版或第四版,虽然版本有差异,但核心章节基本一致,复习时不需要纠结版本号,重点看以下内容是否覆盖:
- 图像数字化与像素间关系;
- 灰度变换与直方图处理;
- 空间滤波与频率域滤波;
- 图像复原模型;
- 彩色图像处理;
- 形态学图像处理;
- 图像分割;
- 表示、描述与识别;
- 图像压缩。
另外,像合肥学院、山东大学等高校都有自己配套的课件和实验指导,复习时建议以本校课件为准,再配合教材做专题梳理。从考研角度看,不必刻意区分“哪个学校考得更难”,因为大多数院校的命题都会围绕基础概念、计算题和算法设计题展开,掌握通解比押题更重要。
1.3 2026 年新应用方向会不会成为考点?
近年来的课程考核越来越重视“传统算法 + 新场景”的结合。数字图像处理在 2026 年及以后的新应用方向,基本集中在以下几个方面:
- 医学影像辅助分析:CT、MRI 图像的增强、分割、病灶区域提取;
- 工业视觉检测:产品表面缺陷检测、尺寸测量、二维码定位;
- 自动驾驶感知:车道线检测、目标检测前的图像预处理;
- 遥感图像分析:土地利用分类、目标识别、图像拼接;
- 深度学习与传统图像处理的结合:用经典算子生成训练标签,或者把形态学操作作为神经网络后处理。
考试中不会直接考“请完整实现一个自动驾驶视觉系统”,但完全可能考“在低光照条件下采集的图像,采用哪些预处理步骤可以提高后续目标检测的准确率?”这类应用分析题。回答这类题时,不要堆砌名词,而要按“问题 → 算法原理 → 预期效果”来组织。
2. 环境准备与工具建议
2.1 实验环境需要准备什么?
数字图像处理课程的实验通常不限制编程语言,但 Python + OpenCV 已经成了最主流的组合,原因主要有三个:
- OpenCV 内置了大量经典函数,可以直接对应教材里的算法;
- NumPy 和 Matplotlib 方便处理像素矩阵和展示结果;
- 代码量少,能把时间花在理解算法上,而不是重复造轮子。
版本方面不写死,因为不同学校机房环境和读者本机环境差异很大。建议使用 Python 3.9 或以上版本,配合较新的 OpenCV 版本即可。如果你用的是 Anaconda,可以通过 conda 创建独立环境,避免和已有项目冲突。
# 使用 conda 创建虚拟环境(名称可以自定义) conda create -n dip python=3.9 # 激活环境 conda activate dip # 安装核心依赖 pip install opencv-python numpy matplotlib如果你的电脑网络环境安装较慢,可以把 pip 源切换成国内镜像源,这个问题在网络比较慢的校园网环境下非常常见。
2.2 没有现成测试图怎么办?
教材实验里经常用lena.png、cameraman.tif、rice.png这类标准图像,但很多同学的电脑里不一定有这些图片。这里提供一个思路:先用代码生成一张带有明显灰度变化和几何形状的测试图,用来验证滤波、边缘检测和阈值分割的效果。
下面这段代码会生成一张模拟图像,左侧是深色方块,右侧是浅色圆形,并加入少量高斯噪声。后面做实验时都可以使用这张图。
# 文件路径:make_test_image.py import numpy as np import cv2 # 生成 300x300 的单通道灰度图,背景为 100 img = np.full((300, 300), 100, dtype=np.uint8) # 左侧画一个 80x80 的深色矩形 img[50:130, 40:120] = 30 # 右侧画一个半径 60 的浅色圆形 cv2.circle(img, (220, 160), 60, 220, -1) # 添加高斯噪声:np.random.normal 生成的浮点噪声需要裁剪到 [0,255] noise = np.random.normal(0, 15, img.shape) img_noisy = np.clip(img + noise, 0, 255).astype(np.uint8) cv2.imwrite("test_image.png", img_noisy) print("测试图已生成:test_image.png")运行这段代码后,可以用 OpenCV 自带的高斯滤波去除噪声,也可以用 Canny 或 Sobel 算子观察边缘检测结果,非常适合作为课程实验的通用素材。
2.3 复习资料怎么组织效率更高?
不建议只收藏一堆“XX 大学数字图像处理课件”“冈萨雷斯数字图像处理 pdf”等资料,而应该建成自己的复习库。每个章节按四个文件维护:
概念笔记.md:用自己的话写概念,不抄定义;公式卡片.md:只记录考试可能涉及的核心公式;代码复现.py:把教材中的算法核心步骤写成可运行代码;错题本.md:记录作业、往年试卷中做错的题目。
学习图像处理时,“看资料”很容易产生虚假的掌握感。真正有效的做法是先看教材,然后把公式推导或代码复现一遍,最后脱离资料向别人讲解。这个过程虽然慢,但对期末和考研复习来说是性价比最高的方式。
3. 核心考点拆解:从像素到图像增强
3.1 图像数字化:采样与量化
所有数字图像处理都从“把模拟图像变成数字图像”开始。这里有两个最容易混淆的概念:
- 采样(Sampling):对空间坐标进行离散化,决定图像有多少行、多少列,也就是分辨率。
- 量化(Quantization):对灰度值进行离散化,决定每个像素用多少 bit 表示。
如果采样不足,图像会出现明显的锯齿和棋盘状失真;如果量化不够,图像的灰度层次会丢失。考试中的典型计算题是:
一幅 1024×1024 的灰度图像,每个像素用 8 bit 存储,问图像的数据量是多少?
计算方法为:
1024 × 1024 × 8 bit = 8,388,608 bit = 1,048,576 Byte ≈ 1 MB这类题只要记住“图像数据量 = 行数 × 列数 × 每像素位数 / 8(字节)”,基本不会出错。另一种变形是把图像分为多通道,比如 RGB 三通道则乘 3。
3.2 像素间的关系与距离度量
数字图像处理的很多算法都会用到像素邻域的概念。常见的邻域包括:
- 4-邻域 (N_4(p)):当前像素上、下、左、右四个相邻像素;
- 8-邻域 (N_8(p)):周围一圈 8 个像素;
- 对角邻域 (N_D(p)):左上、右上、左下、右下四个对角像素。
像素连通性是图像分割和形态学处理的基础。如果一个区域内部所有像素之间都连通,且不再连接其他区域的像素,那么可以把这个区域称为一个连通分量。
距离度量方面,课程中常考三种:
- 欧氏距离;
- 城市街区距离(D4 距离),只允许水平和垂直移动;
- 棋盘距离(D8 距离),允许围绕中心走 8 个方向。
很多同学容易把 D4 和 D8 的适用场景搞混。简单记法是:如果算法只关心上下左右连通,就用 D4;如果允许斜向连通,例如 8 连通区域标记,就用 D8。
3.3 灰度变换与直方图均衡化
灰度变换是图像增强的入门内容,常见变换包括图像反转、对数变换、幂次变换和分段线性变换。
期中、期末和考研出现频率最高的算法是直方图均衡化(Histogram Equalization)。它不直接操作像素值,而是通过调整灰度级的概率分布,使输出图像的灰度直方图尽可能均匀,从而提升对比度。
核心步骤如下:
- 统计原始图像各灰度级的像素个数 (n_k);
- 计算每个灰度级出现的概率 (p_r(r_k) = n_k / MN),其中 (MN) 为图像像素总数;
- 计算累计分布函数 (s_k = T(r_k) = \sum_{i=0}^{k} p_r(r_i));
- 将累计值映射到允许的灰度范围,例如 0 到 255;
- 根据映射关系重构输出图像。
考试要求不一定让你写出完整代码,但常会让你根据一张给定直方图计算均衡化后的灰度映射表。这类题只要公式正确并保留小数精度,一般都能拿到大部分分数。
在 OpenCV 中,使用函数equalizeHist即可完成灰度图像的直方图均衡化,后面实验部分会给出完整代码。
3.4 空间滤波:平滑与锐化
空间滤波是数字图像处理最核心的内容之一,考试占比很高。
平滑滤波主要用于去噪。最简单的均值滤波是取邻域内像素的平均值,但缺点是会模糊边缘。高斯滤波通过邻域像素的加权平均来减少模糊程度,权重由二维高斯函数决定。方差越大,平滑程度越强。
锐化滤波正好相反,它用于突出图像边缘和细节。常见的拉普拉斯算子模板为:
0 -1 0 -1 4 -1 0 -1 0这个模板的加权和表示中心像素与四周像素的差异,能反映局部灰度突变。
考试中常出现两种题:
- 给一个 3×3 局部像素块,要求用给定模板计算中心像素的输出值;
- 问为什么均值滤波能去噪但不能同时保留清晰边缘。
回答第二种题时,可以从频率角度解释:噪声和高斯边缘都包含高频分量,均值滤波相当于低通滤波,会在削弱噪声的同时削掉边缘的高频成分,所以边缘会变模糊。
3.5 频率域滤波:为什么需要傅里叶变换?
频率域滤波的思路是“把图像从空间域变换到频率域,在频率域做处理,再变换回空间域”。如果只看卷积操作,空间滤波其实已经可以完成很多工作,但频率域能够更直观地解释滤波器的频率特性。
低通滤波器保留了低频成分,抑制了高频成分,因此图像变得更平滑;高通滤波器则相反,能提取边缘等高频信息。
课程里要求掌握的高频概念包括:
- 傅里叶变换为什么把图像看作不同频率分量的叠加;
- 低通、高通、带通和带阻滤波器的概念;
- 空间域卷积与频率域乘积的对应关系;
- 理想低通滤波器存在的振铃效应,以及高斯滤波器没有振铃效应的原因。
实变函数基础不太好的同学不用在这一节死磕数学推导,先把“空间域卷积 = 频率域相乘”这一关系记清楚,再把不同滤波器的频域图像和空间效果对应起来即可。
4. 用代码复盘高频实验
数字图像处理的复习最后一定要落到实验上。下面几个实验代码都可以在本地运行,建议先运行一遍,再尝试修改参数观察变化。
4.1 读取图像与灰度化
彩色图像转灰度是图像预处理中最基础的操作。如果不加参数直接使用cv2.imread,OpenCV 默认按 BGR 三通道读取。对于只能处理灰度图的算法,需要先转换成单通道图像。
# 文件路径:exp1_gray.py import cv2 # cv2.IMREAD_GRAYSCALE 表示以单通道灰度模式读取 img = cv2.imread("test_image.png", cv2.IMREAD_GRAYSCALE) if img is None: # 如果为 None,说明路径错误或图片不存在 print("图片读取失败,请检查 test_image.png 是否在当前目录") else: print("读取成功,图像尺寸为:", img.shape) cv2.imwrite("gray_result.png", img)注意:cv2.imread返回None而不是抛出异常时会静默失败。很多同学代码复制后不检查None,直到下一步img.shape报AttributeError才知道路径有问题。这个坑在实验课和工程项目中都非常常见。
4.2 直方图均衡化实验
用上一节提供的带噪声测试图,先查看原图直方图,再做均衡化,比较两者的分布情况。
# 文件路径:exp2_hist_equalize.py import cv2 import numpy as np import matplotlib.pyplot as plt # 以灰度模式读取图像 img = cv2.imread("test_image.png", cv2.IMREAD_GRAYSCALE) # 调用 OpenCV 的直方图均衡化函数 equalized = cv2.equalizeHist(img) # 计算原图和均衡化后的直方图 hist_orig = cv2.calcHist([img], [0], None, [256], [0, 256]) hist_eq = cv2.calcHist([equalized], [0], None, [256], [0, 256]) # 使用 Matplotlib 绘制两幅图像和直方图 plt.figure(figsize=(10, 6)) plt.subplot(2, 2, 1) plt.imshow(img, cmap="gray") plt.title("Original Image") plt.subplot(2, 2, 2) plt.imshow(equalized, cmap="gray") plt.title("Equalized Image") plt.subplot(2, 2, 3) plt.plot(hist_orig, color="black") plt.title("Original Histogram") plt.subplot(2, 2, 4) plt.plot(hist_eq, color="black") plt.title("Equalized Histogram") plt.tight_layout() plt.savefig("hist_result.png", dpi=150) print("结果已保存:hist_result.png")从运行结果可以看到,原图直方图往往集中在一个较窄的灰度区间,而均衡化后直方图的分布范围明显展开,人眼观察到的图像对比度也更高。这背后的原理就是累计分布函数的灰度重映射。
4.3 Sobel 边缘检测实验
边缘检测考察的是像素灰度突变位置。经典算子中,Sobel 算子实现简单、抗噪能力较强,是课程实验最常要求现场手写或调用的算子之一。
# 文件路径:exp3_sobel.py import cv2 import numpy as np # 读取灰度图 img = cv2.imread("test_image.png", cv2.IMREAD_GRAYSCALE) # 高斯滤波去除部分噪声,减少噪声对边缘检测的干扰 blur = cv2.GaussianBlur(img, (3, 3), 0) # Sobel 算子:参数中 dx=1, dy=0 表示沿水平方向求导,检测垂直边缘 # dx=0, dy=1 表示沿垂直方向求导,检测水平边缘 sobel_x = cv2.Sobel(blur, cv2.CV_64F, 1, 0, ksize=3) sobel_y = cv2.Sobel(blur, cv2.CV_64F, 0, 1, ksize=3) # cv2.Sobel 输出可能是负值,需要取绝对值并转换到 0~255 sobel_x = cv2.convertScaleAbs(sobel_x) sobel_y = cv2.convertScaleAbs(sobel_y) # 将两个方向的边缘强度加权合成 sobel_combined = cv2.addWeighted(sobel_x, 0.5, sobel_y, 0.5, 0) cv2.imwrite("sobel_x.png", sobel_x) cv2.imwrite("sobel_y.png", sobel_y) cv2.imwrite("sobel_combined.png", sobel_combined) print("Sobel 边缘检测结果已保存")需要提醒的是,Sobel 算子输出的是梯度幅值,而不是二值化的边缘图。如果希望得到明显的“黑白边缘”,可以继续对sobel_combined做阈值处理,例如:
_, edge_binary = cv2.threshold(sobel_combined, 80, 255, cv2.THRESH_BINARY) cv2.imwrite("sobel_binary.png", edge_binary)在实验中,阈值不要固定成 80,要观察不同阈值对边缘连续性和噪声抑制的影响,这一点经常会在实验报告的问答题中考察。
4.4 Otsu 全局阈值分割实验
图像分割章节中,基于阈值的分割是最基础、最常考的方法。Otsu 算法的核心在于:自动选择一个灰度阈值,使得分割后前景和背景的类间方差最大。
# 文件路径:exp4_otsu.py import cv2 import numpy as np img = cv2.imread("test_image.png", cv2.IMREAD_GRAYSCALE) # 使用 Otsu 自动阈值分割 # 第一个返回值为阈值,第二个返回值为二值图像 thresh_value, binary = cv2.threshold( img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU ) print("Otsu 自动计算得到的阈值:", thresh_value) cv2.imwrite("otsu_result.png", binary)为什么固定阈值经常不够用?因为光照不均匀会导致图像同一目标在不同区域的灰度值不同。此时,一个全局阈值无法同时满足所有区域的分割要求,可以引入自适应阈值方法。OpenCV 中提供了cv2.adaptiveThreshold,它会根据每个像素邻域的特性计算局部阈值,在处理复杂背景下通常比全局阈值更有效。
下面这段代码用于对比固定阈值和自适应阈值的差异:
# 固定阈值,把低于 127 的像素设为 0,其余设为 255 _, fixed_binary = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) # 自适应阈值 adaptive_binary = cv2.adaptiveThreshold( img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, blockSize=11, C=2, )blockSize是计算局部阈值的邻域大小,通常取奇数;C表示从加权均值中减去的常数,C越大,分割结果越倾向于保留更多的暗区域。
5. 形态学、图像分割与图像复原复习要点
5.1 数学形态学:结构元素与基本运算
形态学处理主要针对二值图像,也可以扩展到灰度图像。四种基本运算是:
- 腐蚀(Erosion):只要结构元素覆盖区域内有一个像素为背景,中心像素就被置为背景。效果是让白色目标变小、消除细小凸起。
- 膨胀(Dilation):只要结构元素覆盖区域内有一个像素为目标,中心像素就被置为目标。效果是让白色目标变大、填补细小凹陷。
- 开运算(Opening):先腐蚀后膨胀,作用是去除小椒盐噪声和细小连接。
- 闭运算(Closing):先膨胀后腐蚀,作用是填充目标内部的小孔和缝隙。
考试常问“为什么开运算可以平滑目标轮廓同时不改变目标面积”。回答思路是:腐蚀步骤先消除细小噪声,膨胀步骤则把剩余目标恢复到接近原来的尺寸,因此对主体面积影响较小。
OpenCV 中调用方式如下:
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) opened = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel) closed = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)5.2 图像分割:边缘、阈值与区域法
图像分割是让课本知识和实际应用紧密连接的一章。期末和考研出现过的题型包括:
- 写出 Sobel、Prewitt、Canny 边缘检测的步骤;
- 利用直方图确定分割阈值;
- 区域生长算法的基本流程;
- 基于连通域标记统计目标数量。
Canny 边缘检测是把多个步骤合在一起的算法,包括高斯滤波去噪、计算梯度幅值和方向、非极大值抑制、双阈值检测和边缘连接。回答“Canny 相比直接使用 Sobel 有什么优势”时,一定要提到“非极大值抑制使边缘更细”“双阈值能减少假边缘”。
区域生长算法是一种典型的区域分割方法,基本流程如下:
- 选择一组种子像素;
- 比较种子像素相邻像素与区域的相似性;
- 将满足相似性条件的像素加入区域;
- 重复上述过程,直到没有新像素加入。
这个算法的关键在于“相似性准则”的设计,例如灰度差是否小于阈值。如果准则太宽松,区域会过度生长;如果太严格,区域可能分裂成碎片。
5.3 图像复原:退化模型与逆滤波
图像增强是一种主观处理,目的是让人眼看起来更舒服;图像复原则试图根据退化模型来恢复原始图像,通常需要知道降质过程的先验知识。
退化模型可以写成:
[ g(x,y) = H[f(x,y)] + n(x,y) ]
其中 (f(x,y)) 是原始图像,(H) 是退化函数,(n(x,y)) 是加性噪声。图像复原的目标是给定 (g(x,y)) 的观测结果,尽可能恢复 (f(x,y))。
逆滤波是图像复原最基础的方法,但它的缺点是放大了高频噪声。实际中更多使用维纳滤波,它能在抑制噪声和恢复细节之间取得平衡。考试中如果遇到“为什么逆滤波对含噪图像效果很差”,可以从频率域乘性逆滤波放大了高频噪声这一点出发回答。
6. 期末与考研常见题型与答题模板
数字图像处理虽然知识点繁杂,但题型相对固定。以下表格整理了最常出现的题目类型和答题方向:
| 题型 | 常见考法 | 答题方向 |
|---|---|---|
| 概念辨析题 | 图像增强与图像复原的区别 | 增强是主观处理,复原是基于退化模型的客观复原 |
| 计算题 | 图像数据量、灰度级映射 | 套公式,注意单位和通道数 |
| 模板计算题 | 给 3×3 局部像素块计算滤波结果 | 逐项相乘再求和,注意均值滤波要除以系数和 |
| 实验设计题 | 对一张噪声图像做处理方案 | 先滤波去噪,再增强,再做分割或边缘提取 |
| 简答题 | 为什么高斯滤波比均值滤波平滑更自然 | 从邻域权重角度解释 |
| 综合分析题 | 给出特定应用场景,选择合适的处理流程 | 按“预处理→核心算法→后处理”回答 |
答题时有一个实用的三段式模板,对很多主观题都适用:
- 问题拆解:先把题目中的目标拆成“图像中存在什么问题”和“需要得到什么结果”;
- 方法说明:说明采用什么算法,并简要写出公式或处理步骤;
- 结果分析:描述处理后图像发生了什么变化,为什么能满足要求。
例如题目是“如何从一张含有椒盐噪声的焊接图像中检测缺陷”,可以这样回答:
第一步,使用 3×3 或 5×5 中值滤波去除椒盐噪声,因为中值滤波对脉冲噪声有很好的抑制效果,同时能保留边缘;第二步,使用灰度变换增强暗部缺陷区域;第三步,用 Otsu 阈值分割将缺陷从背景中分离出来;第四步,对分割结果做形态学闭运算,填充缺陷内部的孔洞。最后计算连通域面积或数量,判断是否存在缺陷。
7. 常见问题与排查思路
在运行代码和复习过程中,有一批高频问题几乎每个人都会遇到,这里整理成表格方便排查:
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
代码运行时报错img.shapeAttributeError | cv2.imread返回了空对象 | 检查图片路径、文件名、当前工作目录 |
| Matplotlib 显示图像颜色异常 | OpenCV 以 BGR 读取,Matplotlib 按 RGB 显示 | 用cv2.cvtColor(img, cv2.COLOR_BGR2RGB)转换 |
| 直方图均衡化后图像发白 | 图像本身动态范围很窄,均衡化过度拉伸 | 尝试限制对比度自适应直方图均衡化(CLAHE) |
| Sobel 边缘检测结果全是黑或全是白 | 没有对负值取绝对值,或没有转换为uint8 | 使用cv2.convertScaleAbs() |
| 形态学操作后目标消失了 | 结构元素太大或腐蚀次数过多 | 缩小结构元素,观察中间结果 |
| Otsu 分割效果不好 | 图像光照不均匀 | 改用自适应阈值,或先做顶帽变换 |
| 代码能运行但结果不符合预期 | 参数没有针对图像调整 | 每修改一个参数就保存一次中间结果,进行对比 |
实际排错时,最重要的习惯是“分阶段保存中间结果”。很多同学直接运行总代码,一旦输出异常就不知道问题出在哪个环节。正确做法是在滤波前、滤波后、分割前、分割后各保存一张图,用肉眼判断每一步是否达到预期效果,再决定下一步怎么调整。
8. 工程与备考实践建议
8.1 实验代码要注意什么?
课程实验和工程代码不一样,实验更看重“算法步骤清晰”和“结果可解释”。建议在代码注释里写清楚每个函数对应于教材中的哪个算法,而不仅仅写一句“调用 opencv 函数”。
例如,当你写cv2.equalizeHist(img)时,注释可以写成:
# 直方图均衡化: # 1. 统计灰度频数 # 2. 计算累计分布函数 # 3. 将灰度映射到 [0,255] equalized = cv2.equalizeHist(img)这样写,一方面有利于实验报告整理,另一方面在考研复试时如果老师问“你是真的理解还是只调库”,你能说出函数背后的处理流程。
8.2 对高频考点形成自己的知识闭环
数字图像处理复习到最后,一个有效的自测方式是“白纸闭卷画图”。拿一张 A4 纸,凭记忆画出全书章节导图,每章写下至少 5 个核心概念和 2 个公式。例如在“空间滤波”下面,你要能写出高斯滤波的作用、Sobel 算子模板、均值滤波的缺点、边缘检测与锐化的关系。
如果某一部分只记得名词而写不出细节,说明这部分还没有真正内化,需要回到教材对应章节重新梳理。计算题只靠看是永远不够的,建议认真做课后题和往年试卷,尤其要把图像数据量、直方图均衡化映射表、3×3 滤波输出值这三类计算题练到条件反射的程度。
8.3 复习优先级与避坑建议
时间紧张的情况下,优先复习以下核心内容:
- 图像数字化与像素关系;
- 灰度变换与直方图均衡化;
- 空间滤波模板与边缘检测;
- 图像分割中的阈值法和边缘法;
- 形态学四种基本运算及其应用;
- 图像压缩里的有损与无损编码概念。
有几点避坑想法也分享给正在准备复试的同学:
不要花大量时间背冷门算法的繁琐代码,要把精力放在“算法思想、适用场景、基本步骤”上。复试面试时,老师更看重的是思路是否清晰,而不是你能不能默写源码。真正拉开分数差距的,往往是“这个算法有什么优缺点”“什么场景下使用会失效”这类开放性问题。回答时不要绕弯子,直接给出核心结论,再补充原因,就能给老师留下很干练的印象。
复习到后期,可以把本文当作一张“考点导航图”,如果哪个章节提到的方法你不能在三秒钟内说出“是什么、解决什么问题、怎么实现”,就回到课本去补齐。图像处理是门实践性很强的课程,把重要算法用代码实现一遍,很多原本抽象的概念会瞬间变得具体。