
简介面向MATLAB图像处理初学者、科研人员及相关课程学生这份zip专题围绕图像除法去除背景清晰图像展开针对背景光照不均匀或前景目标被背景干扰的场景演示了基于imdivide函数完成像素级相除、提升目标对比度的完整方法尤其适合文档扫描、显微图像或工业检测中需要弱化均匀背景、突出主体的任务。压缩包共2个文件包含1个m源码脚本与1个mp4操作讲解视频整体仅5.31MB便于快速下载与对照练习视频可帮助零基础用户理解每一步操作m脚本则方便直接运行和二次开发。视频同步展示了图像读取、双精度转换、背景图选取及预处理等关键细节并结合实际效果讲解直方图均衡化、平滑滤波和阈值分割等常见手段的适用时机源码则保留了标准流程覆盖imread读取、im2double转换、imdivide相除和imshow显示等步骤注释清晰便于读者修改背景图与参数并迁移至自己的灰度图或单通道图像。演示中还特别提醒除零错误与溢出问题的处理方法帮助规避背景图选取时的常见误区。目前已有133人参与学习/下载适合希望在短期内掌握图像除法去背景这一技能的中初级MATLAB用户。1. 图像除法去除背景清晰图像这一招比直方图均衡更直接场景相机正对一块金属表面拍照环形灯没有打匀左边比右边整整高出一档曝光。多数人第一反应是直方图均衡化或伽马校正但这两个都是全局灰度映射只改像素值分布形态区分不了哪部分暗来自灯光、哪部分是物体本来的低反射率。图像除法去除背景清晰图像的思路是把亮度当成乘性背景光照分量随空间缓慢变化先在原图里估计出这个背景再做逐像素除法剩下的就是反射率的相对变化。这在 matlab 图像处理里通常写成I ./ B或imdivide(I, B)。本文按“估计背景 → 执行除法 → 重标定显示”的顺序展开最后给到一份可以直接改参数运行的完整流程。2. 图像除法的数学基础照度-反射模型与 imdivide 的归一化规则2.1 照度-反射模型除法是乘性背景的逆运算在相机成像的简化模型中像素灰度 f(x,y) 约等于光照分量 i(x,y) 与表面反射分量 r(x,y) 的乘积f(x,y) i(x,y) · r(x,y)光照分量描述光源强弱和空间分布它的特征是变化缓慢主要集中在频域的低频段反射分量保留纹理、边缘、划痕、焊点这类中高频信息。两个分量以乘性耦合原因在于光能从光源到传感器经历了两级调制入射光强决定单位面积上的光子数表面反射率决定其中多少被弹回。如果图像里混入了一个空间上缓慢变化的光照层常规的线性灰度拉伸和直方图均衡都帮不上忙。直方图均衡的优化目标是让整幅图的灰度直方图趋于平坦它不会单独处理低频光照因此在光照不均的区域里暗部细节和黑色背景会被同时放大对比度反而出现局部过曝。正确的做法是找一个近似的B(x,y)代表i(x,y)再计算R f / B。只要B足够接近真实光照分布R就近似等于反射率的归一化结果均匀表面区域比值接近 1划痕或凹陷区域比值明显小于 1白色氧化物或光斑则大于 1。这里有一个容易被忽略的物理直觉除法得到的值是一个相对值运算结果不是绝对反射率而是相对于估计背景的偏离。正是这种“绝对亮度转成相对变化”的性质让后续阈值分割、边缘检测可以在同一照度尺度上比较这也是缺陷检测场景偏爱图像除法而不是简单减背景的原因。2.2 imdivide 与./的差异整数缩放和裁剪陷阱把公式落到 MATLAB 代码首先会遇到一个类型转换的坑。图像除法有两种常见写法A uint8([180 90 45]); B uint8(90); C1 A ./ B % 普通逐元素除法结果转回 uint8 C2 imdivide(A, B) % 图像处理工具箱的除法A ./ B会先进入 double 空间计算得到[2, 1, 0.5]再按四舍五入规则转回 uint8最终是[2 1 1]。这里 0.5 被舍入成 1等于把“半个亮度”丢掉了。imdivide(A, B)走的是另一条路径它对整数输入先用im2double把两幅图缩放到[0,1]执行除法后再按 255 倍拉回并对超出 0~255 的数值做裁剪。于是180/902.0被拉高到 510 再裁剪成 25590/901.0映射回 25545/900.5映射到 127.5舍入后为 128最终得到[255 255 128]。如果换成 double 输入Ad im2double(A); % [0.7059 0.3529 0.1765] Bd im2double(B); % 0.3529 C3 Ad ./ Bd; % [2.0000 1.0000 0.5000]输出保留了真实的数值比例没有自动放大也没有裁剪。这适合作为进一步处理的基础因为可以在中途观察值是否超过 1、是否需要加下限保护。写法输入类型45/90 的结果180/90 的结果是否保留真实比值./uint81四舍五入2否imdivideuint8128反缩放255裁剪否./double0.52.0是这个差异直接解释了为什么很多初次接触图像除法的人会抱怨“除完之后整张图白花花一片”uint8 路径的imdivide会把比值大于 1 的像素全部推到白色不适合作为计算主路径。常见做法是全流程用im2double除法用./显示前再mat2gray。提示除法结果R对平坦区域趋近于 1对暗特征趋近 0对亮特征大于 1。直接用imshow(R)会把大于 1 的部分全部显示成白色显示前记得用mat2gray(R)或者乘mean(Bg(:))让平坦区回到原图平均亮度附近再做对比度拉伸。2.3 零除数保护除法前的背景下限钳位当背景估计值在个别像素上接近 0 时无论走哪种路径除法都会出现超大值或 Inf。常见做法有两种一种是在除法前给背景做下限钳位Bg max(Bg, eps)另一种是直接用Bg(Bg 0.05) 0.05把低于最低曝光阈值的像素视为不确定区域。对形态学方法估计的背景一般不会出现纯 0但在图像四条边或阴影角落依旧可能出现趋近于 0 的数值。背景下限需要放在除法之前除完再设下限没有任何意义因为极端值已经混进了结果。3. 图像除法前的背景估计形态学开闭、高斯滤波与多项式拟合的取舍3.1 形态学开闭运算结构元素半径决定背景尺度背景估计的目标是提取一个只含低频光照模式的图像保留空间上的亮度变化同时忽略小于最大缺陷尺寸的细节。形态学方法适合特征尺度相对固定的场景一套标准的先开后闭估计可以写成se strel(disk, radius); Bg imopen(Ig, se); % 先去除暗特征保留亮背景 Bg imclose(Bg, se); % 再去除亮噪声点 Bg imgaussfilt(Bg, 2, Padding, replicate);其中radius的选取遵循一条简单原则结构元素半径应大于图像中最大有效特征的直径的一半。举个例子一张钢板图中最长的划痕为 120 像素那么radius至少取 60否则划痕会并入背景估计除法后这条划痕的响应被削弱。但radius也不是越大越好过大的半径会让背景无法跟随光照陡峭的过渡区例如多盏灯叠加造成的亮带除法后就在亮带边缘出现环形伪影。常见做法是对同一张图把radius按 40、80、120 递增观察除法结果中特征响应的变化取曲线拐点处的值。对于矩形图幅strel(rectangle, [w, h])可以替代 disk运行速度更快但在各向异性的光照边界上更容易留下方向性残留。对非矩形光斑和大多数自然光照disk 的稳定性更好。3.2 高斯滤波sigma 相当于一个空间尺度的开关如果光照梯度平滑、没有突然的暗角可以直接用高斯滤波估计背景代码只有一行sigma 0.1 * min(size(Ig)); Bg imgaussfilt(Ig, sigma, Padding, replicate);经验上sigma取图像短边尺寸的 0.050.15 之间。sigma等于 0.1 倍短边意味着高斯核主瓣覆盖约短边 1/3 的区域只有空间周期显著大于该尺度的灰度变化会被当作背景保留。从目标特征尺度出发也能标定如果最大特征直径为 120 像素sigma至少需要大于该直径的 3 倍即 360 像素放在 1000×800 的图像上略偏大所以需要同时参考图像尺度和特征尺度两个条件。高斯滤波的边界默认补零会在暗背景上造成一圈暗边因此代码里显式写了Padding, replicate用最近邻像素值向外扩展。处理 4000×3000 这类大图时imgaussfilt的速度远快于形态学结构元素操作适合作为先粗后细调试流程里的第一版背景。3.3 多项式曲面拟合最小二乘的手写实现前两种方法都是空间滤波思路多项式拟合则是把背景当成解析曲面。它适用于光照模式稳定、光源方向基本固定且没有强烈局部阴影的场景。装有 Curve Fitting Toolbox 时可以直接用fit没有工具箱时三阶多项式的最小二乘实现如下[h, w] size(Ig); [y, x] ndgrid(1:h, 1:w); % 三阶二维多项式基1, x, y, x^2, xy, y^2, x^3, x^2y, xy^2, y^3 A [ones(h*w, 1), x(:), y(:), x(:).^2, x(:).*y(:), y(:).^2, ... x(:).^3, x(:).^2.*y(:), x(:).*y(:).^2, y(:).^3]; % 最小二乘求解系数再重建背景 coef A \ Ig(:); Bg reshape(A * coef, h, w);矩阵A的尺寸是(h*w) × 10对一张 100 万像素图像大约占用 80 MB 内存加上中间临时量会到 200 MB在 MATLAB 里可以接受。更大图建议先降采样再拟合用第 4 章会讲到的缩小-放大策略。注意全局最小二乘对离群值敏感缺陷像素占面积比例不超过 5% 时影响可忽略缺陷密集时先用一版粗背景估计把缺陷像素临时替换成背景值再做二次拟合。方法代码复杂度大图速度边界表现主要适用形态学开闭运算低中等边缘会有内缩特征尺度固定、形态明确高斯滤波一行快replicate可缓解光照平滑、不需要解析表达多项式最小二乘中等快全局控制边缘自然光源固定、无局部阴影实际项目里我一般先用高斯滤波把问题跑通再视残差决定要不要换形态学多项式拟合更适合把背景公式写进文档或固件据后续流程不需要再读回整幅背景图时用它最合适。3.4 三种方法的组合顺序和边界表现三种基础方法并非互斥。当原始图像噪声明显、光照分布又带折边时可以先做一次轻量高斯去噪再做形态学估计这样可以显著减少除法结果的块状伪影同时保留光照形态的过渡。一个常用的组合是imgaussfilt(Ig, 1.5)作为第一步随后对背景再做imgaussfilt(Bg, sigma)平滑兼顾两种方法的优点。顺序上不要反过来原因是先形态学后滤波会平滑掉形态学输出的边缘位置导致背景灰度与原始照明之间出现偏移。4. 图像除法去除背景实战不均匀光照钢板的完整处理流程4.1 从 imread 到 mat2gray主流程代码与每一步的取舍直接用一个可以跑通的原型来说明场景是一块金属板在环形灯下拍摄左亮右暗表面有划痕和灰点目标是去掉光照梯度让划痕在均匀背景上显示。I im2double(imread(plate.jpg)); if size(I, 3) 3 Ig rgb2gray(I); else Ig I; end % 1) 形态学开闭组合估计背景 se strel(disk, 55); Bg imopen(Ig, se); Bg imclose(Bg, se); Bg imgaussfilt(Bg, 3, Padding, replicate); % 2) 逐像素除法浮点路径保留真实比值 R Ig ./ Bg; % 3) 对除法结果做一次轻量去噪 R imgaussfilt(R, 1); % 4) 显示前统一映射到 0~1 R_disp mat2gray(R); figure(Name, 背景去除); tiledlayout(1, 3); nexttile; imshow(Ig); title(原始); nexttile; imshow(Bg); title(估计背景); nexttile; imshow(R_disp); title(除法结果);第 2 步用./而不是imdivide的原因已经在前面讲透换成 uint8 的imdivide会在除法后按 255 倍拉回并裁剪划痕区域与正常区域的比值差异被压缩到无效范围细节在显示前就丢了。用im2double后除法得到的是真实比例的浮点数mat2gray只负责显示映射不参与计算。第 1 步中strel(disk, 55)是按最长缺陷直径 120 像素推出来的开闭组合先去除暗划痕再恢复亮斑点避免缺陷进入背景估计。Bg在进入除法前额外做一次高斯平滑是为了消除形态学运算形成的块状边界sigma3远小于背景特征尺度不会改变背景总体形状。4.2 大图像与批量图片的落地路径图幅达到 4000×3000 时全局形态学开闭的内存占用和时间开销都会明显上升常见做法是先在低分辨率上估计背景再放大回原尺寸s 0.25; Ig_s imresize(Ig, s); se_s strel(disk, round(55 * s)); Bg_s imopen(Ig_s, se_s); Bg_s imclose(Bg_s, se_s); Bg imresize(Bg_s, size(Ig), bilinear); R Ig ./ Bg;结构元素半径必须随缩放比例同步缩小背景放大用双线性插值就够因为背景本身低频高阶插值只会增加计算量。批量处理时整条流程可以收进循环把路径、结构元素半径和输出目录作为参数暴露再用 MATLAB 的批处理模式运行files dir(fullfile(raw, *.jpg)); for k 1:numel(files) I im2double(imread(fullfile(files(k).folder, files(k).name))); % 中间流程与 4.1 一致略 imwrite(mat2gray(R), sprintf(out_%02d.png, k)); end批量处理最容易忽略的地方是每一张图的最长缺陷尺寸可能不同。统一用同一radius时要以所有图片里最大的缺陷尺寸为准否则个别大划痕会被当成背景处理。4.3 关键参数的调参速查表参数作用调参方向失效迹象radius背景可分辨的最小尺度增大去除更长特征减小保留更多细节特征响应被削弱说明半径太小sigma背景估计平滑强度增大让背景更光滑光照边缘出现环形伪影说明过大Padding边界补法一般保持replicate出现暗边说明用了默认补零除法前是否乘均值输出整体亮度乘mean(Bg)让平坦区回到平均亮度无对错看后续阈值需求这几个参数没有固定最优组合按步骤调整先用短边 0.1 倍的sigma跑一版看到残影再用形态学替换最后根据特征对比度微调radius。5. 除法结果不干净的排查方向以及两个可量化的验证指标5.1 整图偏白类型和归一化路径问题这个症状通常发生在把imdivide结果直接显示后发现整幅图发白划痕和背景一起亮。排查时先看原图和背景是不是 uint8只要有一处是整数除法过程就伴随自动缩放和裁剪比值一旦超过 1 就会被压回 255。统一用im2double处理后症状会消失除法后的浮点结果再交给mat2gray或imadjust做显示映射。5.2 特征残影和环形伪影背景尺度没对上背景估计有缺陷时除法后的R里会留下跟特征本身重叠的渐变划痕周围出现类似拖影的过渡或者光照亮带边缘出现一圈亮环。快速检查方法把Bg和Ig叠在一起看若背景图里还能看出划痕轮廓说明radius或sigma没有达到目标尺度。把radius翻倍再试直到背景图里只看到连续的光照层。环形伪影则相反说明背景过于平滑跟不上光照的陡峭过渡这时候需要缩小radius或改用形态学路径。5.3 暗区噪声爆炸给背景加下限Bg越接近零除法比值越不稳定。角落里背景亮度低于 0.02 时除法后基本全是斑点。处理办法是给背景加一个下限再相除Bg_safe max(Bg, 0.02); % 0.02 对应最低可信曝光 R Ig ./ Bg_safe;这一行能显著提高暗角区域的输出信噪比。下限阈值建议由暗角区域的中位数决定而不是全图最小值因为最小值容易被单像素极值带偏。5.4 两个验证指标均匀度比值与边缘保留率第一个指标是背景均匀度比值衡量除法前后灰度的相对标准差变化Bg_std std(Bg(:)) / mean(Bg(:)); R_std std(R(:)) / mean(R(:)); ratio R_std / Bg_std;ratio小于 1 说明除法后的均匀度比原始背景高越接近 0 表示背景被压得越平。第二个指标是边缘保留率用来检查除法是否在拉平背景的同时把有用边缘也压没了edge_i mean(imgradient(Ig), all); edge_r mean(imgradient(R), all); retain (edge_r / edge_i) * (mean(R(:)) / mean(Ig(:)));retain接近 1 表示边缘被完整保留明显小于 0.3 说明图像主要结构被当成背景除掉了。指标只能指出方向最终验收标准还是回到具体检测目标划痕和背景之间的对比度能否支持你的阈值分离这套图像除法流程才算真正跑通。本文还有配套的精品资源点击获取