ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

重读《图像处理、分析与机器视觉》第四版:图像预处理核心要点与实战总结

重读《图像处理、分析与机器视觉》第四版:图像预处理核心要点与实战总结

《图像处理、分析与机器视觉》第四版是我手边翻得最旧的一本书,尤其是图像预处理那一章。很多人学图像处理,上来就研究边缘检测、特征提取这些"看起来高级"的内容,结果真正做项目的时候,图像没拍好、光照不均匀、噪声一大堆,后面再牛的算法也白搭。这本书的预处理章节好就好在,它不是简单罗列几个滤波器,而是把预处理放到整个分析框架里去定位,让你知道每一步处理到底在解决什么问题、为后面的哪一步服务。

这篇笔记是我重读第四版预处理章节后整理的,把书上讲的内容和我在实际项目里跑过的经验结合起来。适合正在啃这本书的学生、准备入门机器视觉的开发者,以及那些已经上手做图像处理但总觉得结果不稳定的朋友。文章不会面面俱到复述全书,而是把预处理最核心的几块拆开:灰度变换、几何校正、图像平滑,逐个讲透原理、参数取舍和实战注意事项。

1. 图像预处理的核心思路与章节定位

1.1 为什么图像预处理常常决定整个项目的成败

我最早做图像处理项目的时候,拿到一张照片就想直接做边缘检测,结果检测出来的边缘断的断、碎的碎,根本没法用。后来仔细翻了这本书的预处理章节才发现,问题不在边缘检测算法本身,而在前面少做了几步。图像预处理本质上是把"原始采集到的图像"变成"适合后续算法分析的图像",这两个状态之间往往差得很远。

举个最直白的例子,你在室外拍一张零件照片,光照角度不同,同一个零件的灰度分布会完全不一样。如果直接对这些图像做阈值分割,得到的二值图可能千差万别。但如果你先做灰度变换或者直方图均衡化,把光照差异的影响压下去,后面分割的结果就稳定很多。这本书在预处理章节的开头就点明了这个道理:预处理的目标是增强图像中与任务相关的信息,同时抑制无关的干扰。

书中把预处理分成几大模块:点运算(灰度变换、直方图处理)、几何变换(缩放、旋转、校正)、邻域运算(滤波、锐化、去噪)。每一块解决的都不是同一个层面的问题,但目标一致——为后续的图像分析、识别、测量提供干净、规范、信息量充分的输入。

1.2 第四版预处理体系怎么编排

第四版在预处理这一块的编排逻辑我觉得比很多同类教材更清晰。它不是按"工具"来组织,而是按"你在什么场景下需要什么处理"来组织。比如灰度变换解决的是图像对比度和亮度的问题,几何变换解决的是图像形变和坐标对齐的问题,图像平滑解决的是噪声和细节取舍的问题。

每个模块里,书中都会先给数学表达,再讨论离散化后的实现方式,最后补充实际应用中需要注意的边界情况。比如讲灰度变换的时候,它会分析变换函数曲线对图像灰度分布的影响,而不是只丢给你一个公式让你去背。这种讲法对自学特别友好,因为你一旦理解了变换曲线的含义,遇到新的场景自己就能推导出合适的变换方式,而不是到处找现成函数。

另外我特别注意到,第四版中预处理章节和后面章节的衔接很紧密。比如在讲图像平滑时,它会提到不同滤波器对后续边缘检测的影响;在讲几何变换时,会讨论插值方法对图像质量的影响。这种前后呼应的写法,让你在学预处理的时候就已经开始建立整个图像处理流程的全局观。

2. 点运算:灰度变换与直方图处理

2.1 灰度变换的几种典型函数怎么选

灰度变换是预处理里最基础也最常用的一类操作,本质就是建立一个输入灰度到输出灰度的映射关系。书上给出了几种典型的变换函数:线性变换、对数变换、幂次变换(也就是伽马变换)、分段线性变换。我在实际项目里用得最多的是幂次变换和分段线性变换。

线性变换最简单,就是把灰度范围拉伸或者压缩。比如图像整体偏暗,灰度集中在50到100这个区间,那就可以做一个线性拉伸,把50映射到0,把100映射到255,这样对比度就出来了。但线性变换的问题是它对所有灰度区间一视同仁,如果图像里既有很暗的区域又有很亮的区域,单一的线性映射往往顾此失彼。

对数变换的典型应用是增强暗部细节。它的特点是输入灰度低的时候,输出变化剧烈,输入灰度高的地方,输出变化平缓。相当于把暗部的灰度差异放大、亮部的压缩。我当年处理过一张背光的室内照片,人脸部分黑乎乎一片,用对数变换之后暗部细节明显出来了很多。

伽马变换是最灵活的一个,因为通过调节伽马值可以控制变换曲线的弯曲方向。伽马小于1的时候曲线向上凸,暗部被拉伸;伽马大于1的时候曲线向下凹,亮部被拉伸。我在做屏幕显示相关的项目时,经常需要校正显示器的伽马曲线,这个操作本质上就是在做幂次变换。书中给出了标准公式:输出灰度等于输入灰度归一化后的伽马次方再乘回255,这个公式我在代码里写了不下几十遍。

分段线性变换适合对特定灰度区间做增强。比如在工业视觉里,只关心某个灰度范围的缺陷区域,那就可以把不关心的灰度区间压缩,把关心的区间拉伸。书中特别提醒,分段线性变换的关键在于折点的选择,折点位置直接决定增强的区域和强度,这需要你对图像内容有先验认识。

2.2 直方图均衡化的原理与实现要点

直方图均衡化是这本书预处理章节的重头戏,也是我实际项目里使用频率最高的预处理操作之一。它的核心思想很直观:如果图像的灰度分布集中在一个窄区间,对比度就低;如果能把这个分布"摊开"到整个灰度范围,对比度就提升了。均衡化做的事情就是把累积分布函数当作变换函数,让输出图像的灰度分布尽可能均匀。

我在学习这部分的时候,一开始有个困惑:均衡化之后直方图真的完全均匀吗?书上讲得很清楚,数字图像的灰度级是离散的,灰度级数量有限,所以均衡化的结果只是让直方图近似均匀,而且很多灰度级的像素会被合并。这也是为什么均衡化有时候会让图像看起来有点"过度处理",出现色块或者噪点被放大的情况。

实操中我还发现一个细节,全局直方图均衡化对整幅图像一视同仁,如果图像里既有大面积的暗背景又有小面积的亮目标,均衡化会把大量灰度级分配给背景,导致目标区域反而变得不明显。这时候需要改用自适应直方图均衡化,也就是把图像分成若干小块分别做均衡化。书上在进阶部分也提到了一些改进方向,我后来用到的对比度受限的自适应直方图均衡化(CLAHE),就是为了防止小块区域内噪声被过度放大而加了对比度限制。这个函数在常见的图像处理库里有现成实现,参数主要是分块尺寸和限制阈值。

2.3 实操中如何确定变换方式

在真实项目里,怎么判断该用哪种灰度变换?我的经验是先看直方图。拿到一张图像,第一步永远是看它的灰度直方图,这比肉眼看图像本身靠谱得多。如果直方图集中在暗区,优先考虑伽马变换(伽马小于1)或者对数变换;如果直方图整体偏窄但位置居中,线性拉伸就够用;如果直方图分布跨度大但目标区域对比度不足,就需要分段线性变换或者自适应均衡化。

还有一个容易被忽略的点:灰度变换函数的选择要和后续处理联动。比如后面要做阈值分割,那预处理的目标就是让目标和背景的灰度差拉大,这时候用线性拉伸或者直方图均衡化往往效果不错。如果后面要做边缘检测,那灰度变换的作用是让边缘两侧的灰度差更明显,这时候伽马变换的调节空间更大一些。

注意:灰度变换处理的是像素值的映射关系,它不会改变像素之间的空间位置关系。所以当你需要同时处理几何形变和灰度问题时,灰度变换和几何变换是独立的两个步骤,顺序可以灵活安排,但逻辑上要分开。

3. 几何变换:旋转、缩放与坐标映射

3.1 常见几何变换与参数计算

几何变换在预处理阶段的重要性,我是在做多相机拼接的项目时真正体会到的。图像拼接的第一步就是对不同相机拍摄的图像做几何对齐,如果这一步偏差几个像素,后面的融合就会出现重影或者接缝。

书中把几何变换讲得很透彻:所有几何变换本质上都是坐标映射问题。你要把输出图像上的每个像素坐标,映射回输入图像上找到对应位置的像素值。旋转、缩放、平移这些变换都可以用仿射变换矩阵统一表达,书中给出了完整的矩阵形式和推导过程。这个统一表达的思路非常重要,因为在实际代码里,你不需要为每一种变换单独写逻辑,只需要构造对应的变换矩阵,调用同一个变换函数就行。

以旋转为例,图像绕中心旋转一定角度,计算输出图像尺寸时需要特别注意。旋转后的图像范围会变大,如果输出画布保持原尺寸,图像的四角会被裁剪掉。书中提醒了这一点,我实际写代码时就吃过这个亏——旋转后零件边缘被截断,导致后续测量结果偏小。解决办法是预先根据旋转角度计算新的画布尺寸,必要时适当扩大画布。

另一个常见操作是缩放。图像缩放的参数很好理解,但关键问题在于目标尺寸怎么定。如果只是预览用,缩小到屏幕宽度就好;如果要用于后续特征提取,缩放比例就要考虑特征本身的尺度。书上强调了一点:几何变换会改变像素的空间采样关系,因此缩放比例不是随便定的,过大的缩放倍数会丢失信息,过小的缩放倍数会增加计算量。

3.2 三种插值方法对比与选型

几何变换绕不开插值问题。因为映射后的坐标往往是小数,而图像只有整数坐标上有像素值,这时候就需要通过插值来估计。书上介绍了三种经典插值方法:最近邻插值、双线性插值、双三次插值。

最近邻插值最粗暴,直接取最靠近的整数坐标像素值。优点是计算速度快,缺点是图像会出现明显的锯齿,如果放大倍数大,马赛克效果非常严重。我一般只在需要保留原始像素硬边的场景下才用,比如某些二值图或像素画的缩放。

双线性插值是最常用的折中方案,它利用目标坐标周围四个像素做两次线性插值。效果比最近邻好很多,边缘平滑,计算量适中。我做的绝大多数几何变换都用它。但双线性插值有个副作用是会让图像变"软",锐利的边缘会被轻微模糊,这在视觉测量项目中需要注意。

双三次插值用目标坐标周围16个像素做三次多项式插值,边缘保持能力更好,但计算量明显增大。书上给出了它的核函数形式,我实际测试下来,如果是大幅缩图(比如从4000万像素缩到100万像素),双三次的细节保留确实比双线性好,但处理时间大约多花一倍。需要根据项目对实时性的要求来权衡。

3.3 批量处理时的坐标对齐问题

做批量图像处理时,几何变换最容易踩的坑是坐标对齐不一致。比如你有一批零件图像,每张图像中零件的位置、角度略有不同,你想把它们统一旋转到正立状态。如果每张图独立计算旋转中心,最终输出图像里零件的相对位置就对不齐,后续做特征提取时特征坐标就无法直接比较。

我的做法是先定义一个统一的参考坐标系,所有图像的几何变换都以这个坐标系为基准。具体操作时,先通过模板匹配或者特征点检测找到每个图像中零件的旋转中心和角度,然后把所有图像变换到同一个标准位姿,确保后续分析时相同特征出现在图像的相同位置附近。书上虽然没有直接讨论批量对齐,但它对几何变换数学原理的深入讲解,让我能很清楚地理解这个过程背后的坐标系变换逻辑。

还有一个容易忽略的细节是变换后的图像边界填充。几何变换后,图像边缘会出现空洞区域,用什么值填充这些区域会影响后续处理。书上的传统做法是填零(黑色),但在很多实际场景里,填零会导致边缘检测时产生虚假边缘。我现在更倾向于用边缘像素值或者镜像填充,这样不会引入突兀的灰度跳变。

4. 图像平滑:噪声抑制与细节取舍

4.1 先搞清楚噪声从哪来

图像平滑这章,我觉得最有价值的内容是对噪声来源的系统总结。很多时候你都不知道自己处理的是什么类型的噪声,就盲目上滤波器,效果自然不好。书上把噪声分为几大类:高斯噪声、椒盐噪声(脉冲噪声)、周期噪声,每一类都给出了数学模型和产生场景。

高斯噪声是传感器在低光照条件下最容易出现的,特点是每个像素都叠加了一个服从高斯分布的随机量,图像整体看起来"蒙"了一层细颗粒。椒盐噪声更像是图像上随机出现的白点或黑点,常见于传输干扰或者传感器坏点。周期噪声则表现为图像上规律性的条纹或网格,通常是图像采集过程中的电气干扰导致的。

为什么先判断噪声类型这么重要?因为不同的滤波器对不同噪声的抑制能力差异巨大。书上在实验对比部分做得很到位:均值滤波对高斯噪声有效但对椒盐噪声效果差,而且会把边缘搞模糊;中值滤波对椒盐噪声几乎有奇效,但对高斯噪声效果一般。如果你连噪声类型都没搞清楚就选了滤波器,很可能处理完之后噪声没去掉多少,细节倒是模糊了一大片。

4.2 三种经典滤波器怎么选

均值滤波的原理最简单,取邻域内所有像素的平均值作为中心像素的输出值。它能平滑噪声,但代价是所有细节都被削弱了,尤其是边缘。书中给出了一个我至今记住的结论:均值滤波在抑制噪声的同时,把边缘也"抹平"了,因为它本质上是一个低通滤波器,高频信息(包括噪声和边缘)都被衰减。所以均值滤波一般只适合对细节要求不高的场景。

中值滤波的原理是取邻域内像素值排序后的中位数作为输出值。它的厉害之处在于,对椒盐噪声这种极端像素值非常敏感的场景,中值滤波能在去除噪声的同时较好地保留边缘。我在给一张被扫描的老照片去划痕点的时候,中值滤波是唯一一个让我满意的方案。书中特别分析了中值滤波的窗口形状选择:方形窗口对图像细节的破坏较大,十字形窗口能更好地保持线条状结构。

高斯滤波是均值滤波的加权版本,邻域中心权重最大,越靠边权重越小,权重分布符合高斯函数。它的优势在于平滑程度可控,通过调整高斯核的标准差,可以精细控制保留多少细节。我在实际项目中最常使用高斯滤波,因为它能在去噪和保持主体结构之间取得更好的平衡。书上给出的高斯核生成公式,我每次都用它来计算模板,注意标准差的选择直接影响滤波效果:标准差越小,平滑越弱;标准差越大,图像越模糊。

4.3 滤波窗口尺寸与边界处理

滤波器的窗口尺寸选择,是我见过最多新手犯错的地方。窗口太小,去噪效果不明显;窗口太大,细节丢失严重。我总结了一个经验法则:窗口尺寸要和噪声的尺度匹配。如果噪声是单个像素级的椒盐点,3x3的窗口就够;如果噪声是几个像素连成一片的团状噪声,就需要5x5甚至7x7的窗口。书上在处理这类问题时,更多强调的是从频域角度理解滤波器的截止频率,这个思路对深入理解很有帮助,但在工程上直接调整窗口尺寸更高效。

边界处理是邻域滤波绕不开的细节。图像边缘的像素没有完整的邻域,需要确定一个填充策略。书上的经典做法有填零、复制边缘像素、镜像填充多种方案。我在实操中发现,复制边缘像素或者镜像填充比填零效果好得多,因为填零会在图像边界引入极大的灰度跳变,相当于人为制造了一条假边缘。后续如果做边缘检测,这条假边缘会干扰结果。

还有一点要提的是滤波的实时性问题。在视频处理场景中,每帧图像都要滤波,大窗口高斯滤波会让运行时间成倍增加。一种常见的优化方法是利用高斯滤波的可分离性——把二维高斯卷积拆成两个一维卷积,先横向再纵向,计算量大幅下降。书中在高斯滤波部分讲了这种可分离性,我当时照着实现了一遍,速度提升非常明显。

5. 实操过程与代码级复现

5.1 一套典型的预处理流程怎么搭

学完整章的预处理理论,关键是要能落到代码上。我以一个典型的工业零件表面检测为例,分享一套我自己反复使用的预处理流程,大家可以直接参考改造。

第一步是读取图像后立刻转成灰度图。工业场景中彩色信息通常不是必需的,转灰度可以减掉三分之二的计算量。第二步是看直方图,判断图像的灰度分布是否合理。如果光照不均匀导致图像一边亮一边暗,先做背景校正或者分块均衡化。第三步根据噪声情况选滤波器,我一般先用中值滤波处理可能的椒盐噪声,再用高斯滤波做适度的平滑。第四步是几何校正,把零件旋转到标准位姿并统一尺寸。第五步才轮到后面的边缘检测或者阈值分割。

import cv2 import numpy as np # 读取图像并转灰度 img = cv2.imread('part_image.jpg', cv2.IMREAD_GRAYSCALE) # 直方图均衡化,增强对比度 equalized = cv2.equalizeHist(img) # 中值滤波去除椒盐噪声 median_filtered = cv2.medianBlur(equalized, 3) # 高斯滤波平滑,标准差根据噪声程度调整 gaussian_filtered = cv2.GaussianBlur(median_filtered, (5, 5), 1.2) # 几何旋转校正,旋转到标准角度 # 这里假设已经通过模板匹配得到旋转角度 angle angle = 3.5 (h, w) = gaussian_filtered.shape[:2] center = (w // 2, h // 2) M = cv2.getRotationMatrix2D(center, angle, 1.0) rotated = cv2.warpAffine(gaussian_filtered, M, (w, h), flags=cv2.INTER_LINEAR, borderMode=cv2.BORDER_REPLICATE) cv2.imwrite('preprocessed.jpg', rotated)

这套流程写完后,我一贯的建议是先分别保存每一中间步骤的图像,观察每一步的输出。大部分项目翻车都是因为某一步参数不合适,如果只看最终结果,很难定位问题出在哪。

5.2 关键参数的选取心得

如果要说预处理参数里最值得花心思调的两个,我选滤波器的窗口尺寸和高斯标准差。窗口尺寸前面说了要匹配噪声尺度,但还有一个约束是它不能超过目标特征的尺度。举个例子,你检测的缺陷可能是5个像素大的小点,如果你用一个9x9的中值滤波,这个缺陷本身就会被当成噪声去掉。所以正确顺序是先分析任务目标里最小特征的尺寸,再决定滤波窗口的上限。

高斯标准差的选择也有讲究。我常用的方法是:先设定标准差为1到2之间的初始值,观察平滑效果,如果边缘检测结果中伪边缘太多,就适当增大标准差;如果目标边缘断裂严重,就减小标准差。书上给出的一个参考是,高斯核尺寸一般取标准差的三倍左右再取奇数,这样核能覆盖大部分高斯分布的权重区间。

均衡化的参数也值得多说一句。如果你用的是CLAHE自适应均衡化,分块尺寸一般是8x8到16x16,这个值越小,局部增强效果越强,但也会放大局部噪声。限制阈值通常在2到4之间,值越小,对比度增强越温和。我在纹理不均匀的木材表面检测里,用16x16分块加3.0的限幅,效果明显好于全局均衡化。

5.3 预处理与后续分析模块的衔接

预处理做得好不好,最终要看它对后续分析有多大帮助。我在项目中的经验是,每做完一种预处理,就把结果喂给后续算法跑一遍,看输出指标的变化,而不是孤立地评判"图像看起来好不好看"。

以边缘检测为例,预处理的目标是让目标边缘清晰连续,同时抑制噪声产生的假边缘。如果做完了高斯滤波,再用Canny边缘检测,边缘断裂明显减少,但同时目标边缘也变得模糊,那说明高斯滤波的标准差过大。这时候把标准差调小到1.0左右,重新测试,找到一个让边缘清晰度和噪声抑制都满意的平衡点。

书上在讲预处理和后续分析衔接时,特别强调了一个思想:预处理不是越多越好,而是越精准越好。每一步处理都会丢失一部分信息,如果你无法解释这一步处理解决了什么具体问题,去掉它往往是更好的选择。我后期做项目时养成了一个习惯,每次都在预处理流程的每个阶段记录前后图像的差异,并在注释里写明这一步的意图,这样既方便自己复盘,也方便团队协作时其他人理解。

注意:预处理流程不是一次定死的。当你更换了相机、光源或者被测物体材质后,很可能需要重新调整滤波参数和变换参数。把参数尽量集中配置在项目开头的位置,后续调整会方便得多。

6. 常见问题与排查技巧实录

6.1 直方图均衡化后图像为什么发灰

我自己和周围人都遇到过这个问题:做了直方图均衡化之后,图像对比度确实提升了,但整张图看起来灰蒙蒙的,暗部不暗、亮部不亮。原因是均衡化是全局操作,它会强制把直方图拉伸到整个灰度范围,导致原本很暗的背景被拉到中间灰度,原本很亮的区域被压暗。

解决办法有两种。第一种是换用CLAHE自适应均衡化,因为在局部区域做均衡化,能更好地保持原有明暗关系。第二种是用带参数限制的均衡化方法。书上提到过对均衡化做改进的方向,其中裁剪直方图、限制累积分布函数的斜率是有效手段。我现在做工业图像处理时,几乎不用全局均衡化,全部换成CLAHE,效果稳定很多。

6.2 滤波后目标边缘变模糊

这是滤波参数选择不当的典型症状。如果你用了较大的窗口或者过大的高斯标准差,图像确实变平滑了,但目标边缘也被抹开了。测量一下边缘的过渡带宽度,会明显变大。另一个可能的原因是你选了均值滤波,它对边缘的破坏程度比中值和高斯都大。

排查思路是先确认噪声类型和噪声强度。如果噪声本来不严重,就不需要那么强的滤波。我对这个问题的处理方法是把滤波强度降到最低可用值,逐步增加,直到后续算法输出稳定为止。记住一个原则:滤波强度只要能保证后续算法不误判就够,不要追求视觉上"更干净"。

6.3 几何变换后图像出现黑边或锯齿

黑边问题是几何变换后很常见的现象,原因通常是变换后图像边缘区域没有有效像素映射,填充了默认的零值。解决方法是换用边界填充模式,用复制边缘像素或者镜像填充代替默认值。在OpenCV里,这个参数是borderMode,我一般用BORDER_REPLICATE。

锯齿问题则是插值方法不合适。如果是大比例缩小,最近邻插值会产生明显的锯齿和失真;如果是旋转,双线性插值的平滑效果通常已经够用。我建议在代码里把插值方法做成可配置参数,方便在运行效果不佳时快速切换对比,而不是反复改代码重新编译。

6.4 预处理的顺序可以调整吗

在学完整个预处理章节后,有一个问题让我反复确认:灰度变换、几何变换、滤波这三者的处理顺序到底能不能换?书上没有直接给出标准答案,我在项目里试过几种顺序,总结下来大概是这样的:灰度变换和滤波可以互换,但先滤波再灰度变换会更稳妥,因为滤波对噪声敏感,先做灰度变换可能会放大噪声;几何变换一般放在预处理流程的中间位置,太早做会增加后续处理的像素范围,太晚做可能会因为图像形变导致滤波窗口跨到错误区域。

还有一个常见的顺序问题:如果想要缩小图像,应该先滤波还是先缩小?正确答案是先滤波后缩小。因为缩小本身是重采样过程,会引入混叠效应,如果再叠加原本的噪声,图像质量会糟糕得多。书上在频域章节详细解释了混叠原理,但在预处理部分能先用这条实用经验指导操作,理解会更透彻。

7. 这本书预处理章节的学习方法建议

7.1 从数学到代码的转化路径

这本书的预处理章节数学味道比较浓,很多同学读的时候容易被公式劝退。我的经验是不要试图完全搞懂每一个推导细节,而是抓住每个方法的输入、输出和参数这三个关键点。比如直方图均衡化,输入是原始灰度分布,输出是近似均匀的灰度分布,核心参数是灰度级数量和累积分布函数。抓住这三个点,即使数学推导不熟,也能正确使用。

我在读第二遍的时候,把书中每个预处理方法都写了一个十几行的代码实现,然后对照书上的结果图做对比。这一步非常有效,因为写代码的过程会强迫你理解算法的每个步骤到底在做什么。比如写高斯滤波的循环时,你自然会理解为什么权重分布是关键、为什么模板需要归一化、为什么边界像素需要特殊处理。

7.2 预处理效果的评价标准

判断预处理效果好坏的客观标准,不能只看"看起来舒服"。我的经验是从三个维度评价:信噪比有没有提升、目标区域的可分性有没有增强、后续算法的输出稳定性有没有改善。书上在不同章节给出了一些客观评价指标,比如信噪比、对比度、边缘强度等,这些指标比主观目测可靠得多。

实际项目里,我经常做一个简单实验:对同一批图像,分别用三种预处理方案,然后跑同一个后续算法,统计结果的方差。方差最小的方案通常就是最适合这个场景的方案。这个方法虽然朴素,但非常好用,尤其是当你面对一张不知道怎么处理的图像时,用实验数据代替直觉判断,能少走很多弯路。

我在实际使用中发现,这本书的预处理章节值得反复读,每做一个新项目回来重读一遍,都会有新的体会。书上的很多结论不是看一遍就能理解的,比如"均值滤波对边缘的破坏性"这个问题,我最初完全不以为意,直到做精密测量被滤波坑过一次之后,才真正理解书里为什么反复强调这个点。建议读者在学习这章时,一定要搭配实际图像反复试验,把书里的理论变成自己的手感。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进