上篇末尾说过,对比度、信噪比和动态范围这三把尺子,现场到底哪个先卡脖子。前两天聊的是镜头和像元能不能把细特征解析出来;解析够了,算法还是抖,多半就落到这三样上。
我碰到过不少案子:边缘看着清楚,灰度差也明明有,阈值一改就误检、一晚上下限就得重调。客户说"相机不够好",其实相机像素早够了,是噪声把可用灰阶咬掉了,或者亮暗两端同时要看,动态范围顶不住。这篇把三把尺子怎么量、现场怎么用说清楚。
对比度有了,不等于算法稳
先说对比度。外观检测里大家最常盯的就是特征跟背景差多少灰阶。亮处灰度 ImaxI_{max}Imax、暗处 IminI_{min}Imin,调制对比度还是那公式:
C=Imax−IminImax+Imin C = \frac{I_{max} - I_{min}}{I_{max} + I_{min}} C=Imax+IminImax−Imin
比如缺陷区平均 60,背景平均 140,差值 80,C=80/200=0.4C = 80/200 = 0.4C=80/200=0.4。肉眼一看很清楚,阈值夹在中间好像也没问题。可一跑产线,同样的件,阈值一会儿偏高一会儿偏低,漏检误检交替出现。
坑就在这儿:对比度是"信号有多大",没告诉你噪声有多大。 平均差 80 看起来很香,如果每帧同一位置的灰度自己就在 ±15 里晃,那这 80 里有一大截是抖出来的,算法边界当然不稳。对比度解决的是"能不能看见",信噪比解决的是"看见的东西靠不靠谱"。
现场我习惯两件事一起看:在特征区和背景各圈一块均匀区域,算均值差,再看各自的标准差。均值差大、标准差也大,别急着高兴,先把光、曝光、增益压一压,把噪声降下来,再谈阈值。
信噪比:用分贝把"信号扛噪声"算明白
工业相机规格书上的 SNR,多数是按线性灰度(或者电子数)用幅度比来算的:
SNRdB=20log10SN \mathrm{SNR_{dB}} = 20\log_{10}\frac{S}{N} SNRdB=20log10NS
SSS 是信号幅度(比如均匀面的平均灰度),NNN 是噪声幅度(同一区域的标准差)。注意是 20·log10,不是功率那套 10·log10。datasheet 里写 40 dB、45 dB,基本都按这个约定。
拿个数算一遍。一块平坦金属面,曝光调好以后平均灰度 S=180S = 180S=180,同一 ROI 里灰度标准差 N=3N = 3N=3:
SNRdB=20log101803=20log1060≈35.6 dB \mathrm{SNR_{dB}} = 20\log_{10}\frac{180}{3} = 20\log_{10}60 \approx 35.6\ \mathrm{dB} SNRdB=20log103180=20log1060≈35.6 dB
35.6 dB 大概什么水平?粗算一下,S/N=60S/N = 60S/N=60,意思是信号大约是噪声的六十倍。阈值如果放在特征和背景正中间,两边各留十来个灰阶的余量,一般还扛得住。要是噪声涨到 N=10N = 10N=10,SNR 掉到 20log10(18)≈25.120\log_{10}(18) \approx 25.120log10(18)≈25.1 dB,同样那条阈值晚上可能就得重调。
再换个说法。想要 SNR 到 40 dB,需要 S/N=1040/20=100S/N = 10^{40/20} = 100S/N=1040/20=100。灰度均值 180 的时候,噪声标准差不能超过 1.8。现场靠加增益硬拉亮度,信号和噪声一起放大,SNR 往往不怎么涨,有时还往下掉------因为读出噪声、量化噪声那部分并不跟光子一起按比例走。能加光就加光,能加曝光就加曝光,比拧增益靠谱。
经验上我自己用的门槛大概是:外观阈值类,均匀区 SNR 能到 30 dB 以上 比较踏实;要做亚像素、细小灰度差的缺陷,我会往 35~40 dB 靠。这些不是国标,是我调机时候的手感,样件对比度低的还得再严一点。

动态范围跟位深不是一回事
第三个尺子是动态范围。相机规格常写 Dynamic Range,近似可以按满阱容量和读出噪声来估:
DRdB≈20log10NfullNread \mathrm{DR_{dB}} \approx 20\log_{10}\frac{N_{full}}{N_{read}} DRdB≈20log10NreadNfull
举例:满阱 Nfull=10000 e−N_{full} = 10000\ \mathrm{e^-}Nfull=10000 e−,读出噪声 Nread=5 e−N_{read} = 5\ \mathrm{e^-}Nread=5 e−:
DR=20log10100005=20log102000≈66.0 dB \mathrm{DR} = 20\log_{10}\frac{10000}{5} = 20\log_{10}2000 \approx 66.0\ \mathrm{dB} DR=20log10510000=20log102000≈66.0 dB
位深呢?8 bit 是 256 级,10 bit 是 1024 级,12 bit 是 4096 级。很多人直接把位深当成动态范围:这俩不是一回事。 位深是把模拟信号切成多少格,动态范围是从最暗可用信号到饱和之间,真实信噪比还撑不撑得住。
极端情况:12 bit 相机,最低几位全是读出噪声在晃,那最低有效位其实已经废了。假如噪声相当于 4 个 LSB,可用灰阶大约只剩 4096/4=10244096/4 = 10244096/4=1024,跟 10 bit 差不多。规格书写 12 bit,你现场当 12 bit 用,暗部一拉就全是雪花,就是这个原因。
反过来,8 bit 理论上限大约 20log10255≈48.120\log_{10}255 \approx 48.120log10255≈48.1 dB,如果传感器本身 DR 有 60 dB 以上,输出却压成 8 bit,等于把可用范围砍了一截。亮处要看反光、暗处要看凹坑的场合,8 bit 往往先顶满,暗部还在噪声里。这时候换 10/12 bit、或者打两套光分别拍,比继续拧 8 bit 的伽马有用。

现场到底哪把尺子先卡脖子
三把尺子怎么排优先级,我自己的经验是看失败模式,别按说明书顺序背。
阈值飘、同样的件今天过明天不过------先查 SNR。对比度看着有,噪声大,边界就会在阈值两侧来回蹭。加光、降增益、适当加曝光、关掉不必要的锐化,通常比换更高像素的相机管用。
亮处已经发白、暗处特征还埋在灰里------先查 动态范围。金属反光 + 黑胶、玻璃边缘 + 内部缺陷,都是典型。光路能分光就分光,一次拍不住就分两次曝光,别指望靠拉伸曲线把两端同时救活。
特征本身就跟背景糊成一片------那是 对比度 的问题,回到打光和镜头解析,SNR 再高也变不出没有的信号。前面几天讲的 MTF、奈奎斯特,管的就是这一头。
还有个容易混的:增益拉高以后直方图拉开了,看着对比度"变好了",其实 SNR 可能在掉。我现场会固定一块均匀区,增益每加一档就记一次均值和标准差,算一算 20log10(S/N)20\log_{10}(S/N)20log10(S/N) 是升是降。升了再继续加,降了就停,回去加光。
说白了,解析力决定你能不能看见细的,对比度决定特征和背景分不分得开,信噪比决定分开以后稳不稳,动态范围决定亮暗两端能不能同框。产线上最折磨人的,往往不是解析不够,而是 SNR 不够稳、或者 DR 两端都要。
下篇聊图像为什么会糊:离焦、运动模糊、衍射,现场怎么一眼分开,各自又该怎么下手。