news 2026/9/13 8:19:36

MATLAB印刷品缺陷检测系统实战:图像处理与机器视觉全流程解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MATLAB印刷品缺陷检测系统实战:图像处理与机器视觉全流程解析

简介:本资源是一个基于MATLAB开发的印刷品缺陷检测系统,面向计算机、自动化、人工智能及通信等专业的学生、教师与工程实践者,解决印刷质量控制中污点、刮痕、色差等常见缺陷的自动识别与定位问题,适用于课程设计、大作业及毕业设计等实践场景。压缩包共18个文件,含7幅JPG标准图与缺陷样本图像(用于算法训练与测试)、3个MAT数据文件(存储预处理图像与特征参数)、1个PNG流程图(展示检测逻辑)、1个FIG图形界面文件、1个M主程序脚本(含GUI回调逻辑)及2份Word文档(含导入说明与算法设计详解),整体大小为4.18MB。已有51人学习下载,资源提供完整可运行GUI界面、模块化代码结构、图像预处理—特征提取—缺陷判别全流程实现,以及配套技术文档,便于初学者快速上手理解机器视觉基础流程,也支持进阶用户修改算法核心或扩展检测类别。 前两天整理资料,翻出来以前写的一套MATLAB印刷品缺陷检测程序,正好最近不少朋友也在问图像处理大作业适合做什么题目,我干脆把整套系统的思路和关键实现拆开讲一遍。这套系统解决的核心问题,就是用机器视觉替代人工目检,对印刷品上的污渍、漏印、飞墨、套印偏差这类常见缺陷做自动定位和识别。不管你是刚接触MATLAB图像处理的学生,还是要在实验室搭一套离线质检方案,这篇文章的架构、参数和代码思路都可以直接拿来改。废话不多说,先从这套系统到底在检测什么说起。

1. 一个印刷品缺陷检测系统到底要解决什么问题

1.1 缺陷类型和检测难点

印刷品缺陷检测不是简单判断“有没有问题”,而是要回答三个问题:缺陷在哪个位置、属于什么类型、严重程度是否超限。常见缺陷大致有六类:脏点污渍、漏印缺印、飞墨毛刺、套印偏差、色差、划痕刀丝。不同缺陷在图像上的表现差异很大,检测思路也不一样。

脏点污渍通常表现为局部灰度突变,面积小但对比度可能很高,难点在于容易被印刷图案本身的深色区域掩盖。漏印缺印是网点或色块消失,对应区域灰度比标准模板偏亮,严重时是整块空白。飞墨和毛刺出现在字符边缘或者色块边界,呈细小的离散点状或丝状,和噪声特别像,很容易误判成脏点。套印偏差在彩色印刷里很常见,是不同色版的图案没有完全对齐,一般在套色标记处或图案边缘能看到重影。色差是整体色调偏移,单纯靠灰度检测不出来,需要转成Lab颜色空间计算色差。划痕刀丝则是细长条状、方向基本一致,灰度接近背景,对比度低,稍微处理不好就漏检了。

这些缺陷的共同难点是:目标小、对比度低、样本数量少,而且印刷品本身的图文内容复杂,不能简单用“找变化”的思路一刀切。比如一张宣传单上既有大面积色块又有细小文字,色块的灰度和文字边缘的灰度天然就差异很大,缺陷检测算法必须在“允许的图案差异”和“真正的缺陷变化”之间划一条界线。这也是很多新手做检测系统最容易翻车的地方——拿着一个阈值跑所有图像,结果换个产品就全面崩溃。

缺陷类型典型表现主要图像特征检测难度
脏点污渍局部暗点或亮斑灰度突变、小面积连通域
漏印缺印图案缺失、区域偏亮与模板灰度差为正
飞墨毛刺边缘离散颗粒、毛刺边缘附近小连通域
套印偏差重影、边缘双线边缘梯度方向异常
色差整体或局部偏色Lab色差较大
划痕刀丝细长条状痕迹长宽比大、方向一致

1.2 为什么选择MATLAB搭建这套系统

说实话,工业产线上的在线检测系统,主流方案是C++加Halcon或者OpenCV,实时性更好,部署也更方便。但如果是做算法验证、课程项目、实验室离线检测,甚至小批量产线的抽检,MATLAB的优势非常明显。首先,图像处理工具箱里函数齐全,从灰度化、滤波、形态学到连通域分析,几十行就能走完一个完整流程,不需要自己造轮子。其次,MATLAB调试特别方便,变量工作区直接看矩阵,图像窗口实时显示中间结果,有哪个步骤不理想,改一行参数就能立刻看到效果,这种试错效率是编译型语言比不了的。

还有一个容易被忽略的点:MATLAB做图像处理大作业或科研项目时,报告和图表都能直接生成,方便和老师或者甲方沟通。比如检测结果图可以自动标注缺陷框和类型,还能批量导出Excel统计表。这套系统我拿到一个项目里实际跑过,对A4尺寸印刷样张的离线检测,单张图像处理时间大概0.8秒左右,完全够用。

当然也要说清楚MATLAB的短板:处理速度比C++慢,GUI打包成独立程序后启动稍慢,而且License成本不低。所以我的建议是,先用MATLAB把算法核心跑通,如果后续真要考虑产线实时检测,再用MATLAB Coder把算法转成C代码,或者用OpenCV重写一遍。下面讲的所有检测流程,换到OpenCV里同样有一一对应的函数,思路完全通用。

2. 系统整体设计与检测流程

2.1 系统架构与硬件组成

检测系统不只有算法,硬件配合不好,算法再强也白搭。一套最简的离线检测系统由四部分构成:工业相机、镜头、光源和工控机。相机建议用面阵相机,分辨率根据检测精度来算,公式很简单:最小缺陷尺寸要占到3到5个像素以上,否则后期特征提取根本不可靠。举个例子,假设检测视场宽度是200毫米,想检出的最小缺陷是0.2毫米,那么需要的分辨率至少是200/0.2乘以3,也就是横向3000像素以上,所以选500万像素级别的相机比较稳妥。

镜头要配合视场和安装距离选焦距,常规C接口镜头就行。光源这里必须重点强调,很多做算法的人忽视光源,结果图像忽明忽暗,算法怎么调都不稳定。印刷品检测最常用的是低角度环形光,能突出表面脏点、划痕这类凹凸缺陷;如果是检测高反光材料上的漏印,同轴光更合适。背光主要用于检测透光类材料,比如薄膜印刷。光源要尽量用直流供电,避免频闪,而且整个系统最好加遮光罩,减少环境光干扰。

工控机和相机的连接走GigE或者USB3.0都可以。如果是在MATLAB里采集图像,可以装Image Acquisition Toolbox,支持大多数工业相机。我这里整理出的代码流程假设图像已经采集到MATLAB工作区,不单独依赖采集硬件,这样也方便直接用现成的图片测试算法。

2.2 从图像到缺陷结果的算法流程

整套检测流程我分成六个环节:图像采集、预处理、模板配准、缺陷分割、特征提取、分类判定。预处理的目的是消除光照不均、噪声和几何偏移。模板配准是把当前图像和标准模板对齐,因为每次放置印刷品的位置不可能完全一样,差之毫厘,误以千里。缺陷分割是找到可疑区域,可以用差影法、阈值法或者两者结合。特征提取是对可疑区域计算面积、周长、灰度均值、长宽比等量化指标。分类判定就是根据这些指标判断属于哪一类缺陷,以及是否超过允许范围。

整个流程的核心思路是“先粗检,后精判”。粗检阶段尽量把有可能出问题的地方都保留下来,宁可多检几个候选区域,也不能漏掉真正的缺陷;精判阶段用特征和规则把误检滤掉。很多新手在分割阶段就拼命想把缺陷完美抠出来,结果阈值刁钻得一换图片就废掉。正确做法是分割阶段宽松一点,分类阶段严格一点。

2.3 MATLAB工具箱怎么选

做这套系统其实不需要装太多工具箱,核心就是Image Processing Toolbox,里面已经覆盖了图像增强、形态学、连通域标记、regionprops特征提取这些基础功能。Computer Vision Toolbox主要用到图像配准和特征匹配,比如normxcorr2做模板匹配,fitgeotrans做几何变换,如果只是简单的平移校正,Image Processing Toolbox也够用。若想用相机直接采图,就要加Image Acquisition Toolbox。处理批量图片耗时较长时,Parallel Computing Toolbox的parfor能帮你吃满多核CPU。

有人问深度学习做缺陷检测是不是更好,这需要额外装Deep Learning Toolbox,但依赖大量缺陷样本。如果只有几百个样本,我建议还是先用传统图像处理把框架搭起来,后面再考虑用深度学习做分类。因为这属于系统扩展方向,我在第5章单独展开,现在先把传统算法讲透。

3. 核心算法模块的落地实现

3.1 图像预处理:亮度均衡、滤波、几何校正

图像预处理是很多初学者容易敷衍的环节,总觉得滤波一下、转个灰度就完事,但在印刷品检测里,预处理直接影响后续阈值的稳定性。第一步是灰度化,简单用rgb2gray会把颜色信息丢掉,所以如果后面要检测色差,灰度化之前先保留一份RGB图像,检测色差时转Lab颜色空间。灰度化之后要做亮度均衡,原因是照明不均会让图像边缘偏暗,同一个缺陷在画面中心和边缘的灰度差很多,阈值没法统一。

一个很实用的照明不均校正方法是背景拟合法。先对灰度图做一次大尺寸均值滤波,核尺寸比最大缺陷尺寸大很多,比如图像是2000像素宽,核取200左右,这样滤出来的结果近似背景亮度。然后用原图减去背景,或者用原图除以背景,就能得到亮度相对均匀的图像。代码如下:

img = imread('print_sample.png'); if size(img, 3) == 3 gray = rgb2gray(img); else gray = img; end % 估计背景 bg = imgaussfilt(gray, 120); % 用大尺度高斯滤波近似背景 % 校正后图像 corrected = imsubtract(gray, bg); corrected = imadjust(corrected);

这里有个细节:背景核的尺寸要根据图像大小和缺陷尺度调整。核太小会把大块缺陷也当成背景抹掉,核太大则校正效果不明显。我一般的经验是取图像短边的十分之一到二十分之一,具体效果用可视化窗口对比调整。亮度校正之后做滤波去噪,中值滤波medfilt2对去除椒盐噪声很有效,但会模糊边缘,所以如果只是轻微噪声,我更喜欢用imgaussfilt做高斯平滑,sigma取1到1.5。要是想突出细小的划痕,可以用拉普拉斯算子锐化边缘,但要注意拉普拉斯对噪声敏感,最好先平滑再锐化。

几何校正在差影法里必不可少。印刷品放在平台上每次位置都有微小偏移,直接用原图和模板做差,边缘会出现一条明显的假缺陷。最简单的做法是用normxcorr2做全局平移配准,先计算两幅图的归一化互相关,找到峰值位置,用imtranslate平移对齐。这里必须注意,对大图直接做normxcorr2计算量很大,可以先用imresize缩到1/4计算粗略偏移,再在原分辨率上微调。

tmpl = imread('template.png'); offset = normxcorr2(tmpl, corrected); [ypeak, xpeak] = find(offset == max(offset(:))); yoffset = ypeak - size(tmpl, 1); xoffset = xpeak - size(tmpl, 2); aligned = imtranslate(corrected, [xoffset, yoffset]);

如果图像还有旋转偏差,可以在配准后对二值化mark点或图案边缘做直线拟合,计算倾斜角度,再用imrotate旋转回去。这一步在检测套印偏差时特别重要,因为套印偏差本身可能就是1毫米级别,图像稍微偏个0.5度,边缘就会出现几毫米的假重影。

3.2 缺陷分割:差影法、动态阈值、形态学后处理

预处理做完就进入最核心的分割环节。最基础的方法是差影法:用配准后的图像减去标准模板,灰度差超过阈值的地方判定为缺陷。适合漏印、脏点这种灰度变化明显的场景。直接相减的隐患是:印刷图案本身边缘处灰度差异大,微小配准误差也会产生高灰度差,导致大量假阳性。所以我不建议只用纯灰度差,可以在做差之前先对图像做一次高斯模糊,降低边缘梯度差异,或者在得到差值图后再用形态学开运算滤掉边缘细线。

动态阈值是比固定阈值稳定得多的方案。固定阈值对全局光照变化特别敏感,同一批产品换一次光源亮度,检测结果天差地别。动态阈值的思路是对每个像素取局部邻域的均值和标准差,如果当前像素灰度偏离局部均值超过一定倍数标准差,就认定是异常点。MATLAB里的imbinarize(img, 'adaptive')就是这个思路,可以指定Sensitivity参数,数值越大越敏感。

diffImg = imabsdiff(aligned, tmplGray); bwAdaptive = imbinarize(diffImg, 'adaptive', 'Sensitivity', 0.6); % 或者手动实现局部阈值 localMean = imgaussfilt(diffImg, 30); localStd = sqrt(imgaussfilt(diffImg.^2, 30) - localMean.^2); bwManual = diffImg > (localMean + 3.5 * localStd);

形态学后处理主要是消除噪声和修补断裂。先对二值图做开运算,用一个半径为2到3像素的圆形结构元素,可以把孤立噪点去掉,同时保留真实缺陷的轮廓。对面积较大的缺陷,再做一次闭运算,把断裂的部分连起来,然后再用imfill填充内部孔洞。这里有一个顺序问题:开运算放前面,闭运算放后面。如果反了,噪声点先被闭运算连成一片,后面开运算也拆不开了。代码如下:

seOpen = strel('disk', 2); bw = imopen(bwAdaptive, seOpen); seClose = strel('disk', 5); bw = imclose(bw, seClose); bw = imfill(bw, 'holes');

分割之后用bwconncomp标记连通域,后面就能对每个连通域单独分析了。这里我建议把面积很小的连通域直接去掉,比如面积小于30像素的通常可以当成噪声,但这个阈值要结合分辨率调整,最小缺陷面积乘以像素密度再乘一个系数。

3.3 特征提取与分类:面积、周长、灰度、不变矩

拿到了二值图里每个连通域的位置和像素集合,就要算特征了。regionprops函数非常方便,可以一次性提取多个特征。我最常用的特征有:Area面积、Perimeter周长、MajorAxisLength和MinorAxisLength(长轴短轴)、Eccentricity离心率、Solidity(凸包面积占比)、MeanIntensity(原始灰度图上的平均灰度)、BoundingBox外接矩形。对彩色印刷品,还可以计算缺陷区域在RGB或Lab空间的平均色差。

特征的意义需要结合缺陷类型理解。脏点通常是圆形或点状,Eccentricity接近0,Solidity接近1,面积不大,灰度与背景差异明显。划痕刀丝则是长条状,MajorAxisLength远大于MinorAxisLength,长宽比往往超过10,而且方向相对统一。飞墨毛刺出现在图案边缘,面积小,位置靠近边缘,可以利用距离变换看它是否贴近图像边缘区域。套印偏差表现为特定颜色通道的边缘错位,常见做法是分别提取C、M、Y、K四色通道,对每个通道的图案边缘位置做比较。

cc = bwconncomp(bw); stats = regionprops(cc, gray, 'Area', 'Perimeter', ... 'BoundingBox', 'Eccentricity', 'Solidity', 'MeanIntensity');

分类这一步我分成两种做法。样本少、规则明确时,直接用逻辑判断就够。例如面积在50到500像素之间、离心率小于0.6、灰度差大于40的,判为脏点;长宽比大于10且面积大于200的,判为划痕;区域平均灰度差为负且面积很大的,判为漏印。样本较多时,可以取这些特征组成特征向量,用fitcecoc训练一个多分类SVM,MATLAB里几行就能完成。注意要归一化特征,否则面积、灰度这些量纲差异大的特征会把分类器带偏。

% 假设有样本表T,每一行是一个缺陷区域 % 特征列:Area, Eccentricity, Solidity, MeanIntensity % 标签列:Label X = normalize(T{:, 1:4}); Y = T.Label; mdl = fitcecoc(X, Y);

使用训练好的模型时,同样先对特征做归一化处理,用predict函数输出分类结果。对于传统算法和SVM都难以区分的复杂缺陷,再考虑上深度学习。决策边界往往需要根据实际样本画混淆矩阵调优,这个我在下一章讲。

3.4 结果显示与报表生成

检测完不能只在命令行打印一个数字,还需要可视化标注和结果汇总。我用MATLAB自带的insertShape和insertText把检测框和类别标到原图上,再用figure显示。为了让对方直观理解,我会输出两张图:一张是原始图加检测框,另一张是二值图加连通域编号。保存结果时用exportgraphics导出高清图片,再用writetable把每个缺陷的特征和判定结果写入Excel。

rgbWithBoxes = insertShape(img, 'Rectangle', bboxes, ... 'LineWidth', 3, 'Color', 'red'); rgbWithBoxes = insertText(rgbWithBoxes, positions, labels, ... 'FontSize', 18, 'BoxColor', 'red', 'BoxOpacity', 0.7); figure; imshow(rgbWithBoxes); exportgraphics(gcf, 'result_annotated.png', 'Resolution', 300); T = table({labels}', bboxes(:,1), bboxes(:,2), ... bboxes(:,3), bboxes(:,4), statsArea, 'VariableNames', ... {'Type', 'X', 'Y', 'Width', 'Height', 'Area'}); writetable(T, 'defect_report.xlsx');

如果检测的是整批印刷品,我还会在批处理循环里累计缺陷数量,计算每张的缺陷总数和面积总和,按批次输出统计表。这样既能定位单张问题,也能看出整体质量趋势,后面做扩展时会单独提。

4. 实操中的常见问题与排查技巧

4.1 模板怎么选、配准怎么做

模板是整个检测系统的参照基准。最忌讳的方法是拿一张合格品直接当模板,因为印刷品每张都有轻微差异,特别是平网区域灰度波动很大,直接做差会出现大量假阳性。我建议从10到20张合格品中取灰度平均作为标准模板,或者先对多张合格品做配准再逐像素取中值,中值比均值更能抵抗个别样本的局部脏点干扰。

配准环节也是坑很深的地方。全局平移配准在小图上效果不错,但印刷品放置不光有平移,还可能旋转和轻微透视变形。对此我在系统里加入了mark点定位,印刷品角落通常有十字线或圆形定位标记,先用灰度阈值和形态学找到标记中心点,再以这些点为基准计算仿射变换矩阵,用fitgeotrans完成配准。这个方法比纯模板匹配稳定得多,尤其适合彩色印刷的套准检测。注意mark点缺失时要做保护,否则程序直接报错,要在代码里加个判断,找不到mark点时换用全局配准兜底。

4.2 光照一致性差导致误检

这是实测中最常见的误检来源。刚开始我在实验室用普通日光灯照明,一天中不同时段环境光变化很大,早上调试好的阈值,下午误检率翻一倍。后来把检测环境用遮光罩完全罩住,采用直流供电的LED环形光源,图像亮度稳定性立刻上来了。算法层面也同样重要,亮度均衡的预处理步骤不要省,即使光照已经很稳定,也要保留,因为它对每个样品摆放时的阴影变化也有抑制作用。

有一次我遇到一个很隐蔽的情况:光源老化导致亮度缓慢下降,阈值跑了一段时间后开始大量漏检。排查了很久才发现是光源亮度衰减了。所以现在我在采集端会定期用标准白板校准图像亮度,如果平均灰度低于设定范围就报警。对算法而言,动态阈值比固定阈值能容忍更大范围的光照变化,但也不是无限度的,硬件层面的稳定是基础。

4.3 误检与漏检的平衡

检测系统最核心的矛盾就是误检率和漏检率。误检是把合格品判成不良,产线上会造成浪费;漏检是把不良品放过去,后果更严重。阈值设置要区分场景:离线抽检,稍微多点误检影响不大,优先保证不漏;在线全检,误检频繁会导致大量复查,就要适当收紧灵敏度。我在系统里会给每个阈值留配置参数入口,调试时用一个包含正常品和已知缺陷样本的测试集,画出接受者操作特性曲线,或者简单地跑几遍统计误检数,选择准确率和召回率的平衡点。

另一个技巧是滞后阈值法,思路和Canny边缘检测的双阈值一致。先用高阈值检出确定是缺陷的区域,再用低阈值在它们周围向外扩展,把边缘上不太确定的像素也纳入缺陷区。这样既能稳定检出明显的缺陷,又能避免一条细划痕因为某些区域灰度低于阈值而断成几截。实现时不复杂,参考edge函数的双阈值逻辑就可以。

4.4 程序跑得慢怎么优化

MATLAB慢很多时候是因为到处写循环。比如对每个连通域都用find遍历一次,图片多时时间就上去了。我第一个优化思路永远是向量化:能用regionprops一次算完的特征就不要逐个连通域循环,能用矩阵运算就不要用for。第二个思路是用parfor并行处理批量图片,注意嵌套函数里要处理好临时变量,否则并行池会反复报错。第三个思路是减少GUI刷新,批量检测时不要每张图都imshow,等全部检测完再显示结果。

如果处理后端还需要更快,可以考虑删减耗环节:图像尺寸大时,先降采样粗检,找到可疑区域在原分辨率下精检。比如2000万像素的图像,全分辨率做形态学特别耗时,先缩小到1/4检测大块缺陷,再对大区域的边缘做高分辨率复查,速度可以提升一倍以上。但这一步逻辑复杂一些,适合项目真正要提速时再做。我把常见问题整理成一张速查表:

现象可能原因处理方法
整幅图像出现大量边缘假缺陷配准偏移改用mark点或增加配准微调
某一边检不出缺陷光照不均做背景拟合亮度校正
微小脏点漏检阈值过严或分辨率不足降低阈值、检查相机分辨率
划痕断成一段段二值化后断裂闭运算结构元素加大
运行很慢循环过多、全分辨率处理向量化、parfor、粗检精检结合
光源衰减导致漏检光源老化定期亮度校准、光源报警

5. 从大作业、实验室到产线落地,还能怎么扩展

5.1 用深度学习提升复杂缺陷分类能力

传统算法框架做简单缺陷已经够用,但到了复杂纹理印刷品,比如包装纸、标签上本身就有花纹和渐变,传统阈值分割会频繁误检。这时候深度学习就有优势了。常见的做法不是拿深度学习直接做分割,而是把它当分类网络:先用传统差影法快速定位可疑区域,再从原图上截取可疑区域的小图,送进一个预训练的GoogLeNet、ResNet或者轻量分类网络,判断是缺陷还是正常纹理。这样既保留了传统算法定位快的优点,又借助深度网络解决误分类问题。

在MATLAB里实现很简单,deepNetworkDesigner可以交互式搭网络,trainNetwork训练,classify做预测。但要注意深度网络非常吃样本,每个缺陷类别至少几百张图才靠谱。如果样本不够,可以先用ImageDataAugmenter做平移、旋转、缩放增强,还能用迁移学习微调预训练模型。我的经验是,对于印刷品缺陷这种背景比较固定的场景,把网络输入分辨率设小一点,比如128×128,既能保留缺陷细节,又不会让训练过慢。

5.2 对接相机、PLC和部署为独立程序

实验室验证完算法之后,要往产线走,就有两个硬需求:实时采集和独立运行。采集端用Image Acquisition Toolbox可以连主流工业相机,实时预览加触发采集。如果产线上有光电传感器和PLC,还可以用串口或TCP通信,收到触发信号后采集一帧图像,检测完把结果通过串口发给PLC做剔除动作。MATLAB里串口通信用serialport就行,嵌入式Linux上也能部署,这块内容比较杂,但实际项目大半时间都耗在这里。

部署为独立程序用MATLAB Compiler打包成exe,目标机器不用装MATLAB,只装运行库。不过打包后的启动速度会慢一些,内存占用也大,适合离线检测和人工辅助质检。要做高速在线全检,我建议用MATLAB Coder把核心检测函数转成C++,再嵌入到工业软件框架里。转C++之前要特别注意代码的可生成性,某些GUI函数和动态类型操作没法生成代码,需要提前按代码生成要求重写。

5.3 报表统计和质量追溯

算法只是把缺陷找出来,真正对生产有价值的是统计分析。我在系统里加入了批次汇总模块,每检测完一批都自动生成报表,统计缺陷类型分布、平均不良个数、趋势曲线。这些数据再配合产品批次号、检测时间、缺陷图像存档,就形成了完整的质量追溯链。一旦客户投诉某批产品有缺陷,可以直接倒查当时检测的原始图像和判定结果,确认是漏检还是新出现的缺陷类型。

有了历史数据之后还能做更高级的事,比如用统计过程控制方法监控不良率趋势,当缺陷数量接近控制上限时提前预警。这些都是算法检测之外的价值,尤其适合想把这套系统做成一个完整毕业设计或者实验平台的同学。后面做扩展时,最好在架构设计初期就把结果数据存储格式定好,避免后期返工。

最后说一点个人体会:跑了这么多次检测项目,越来越觉得算法不是全部,真正让系统稳定运行的往往是光源、夹具、相机选型这些看似不起眼的因素。很多缺陷类型用再精巧的算法也救不了太差的图像质量。反过来,只要照明和定位做好了,哪怕用最朴素的差影法,也能解决七八成问题。如果你刚起步,别急着先堆深度学习,先把手里的传统图像处理链路调稳,再逐步扩展,这条路最扎实。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 8:18:22

大模型应用开发:普通程序员也能掌握的收藏必备技能!

本文详细解释了大模型应用开发的概念,强调其与算法岗的区别,指出普通程序员也能参与其中。文章还介绍了应用开发者的日常工作内容,包括业务流程建模、模型交互调优等,并深入探讨了RAG、Agent、调用和部署等关键模块。最后&#xf…

作者头像 李华
网站建设 2026/9/12 10:10:27

Nucleo-WBA25CE1开发板BLE Direct Test Mode(DTM)射频测试实战解析

手里拿到一块 Nucleo-WBA25CE1 开发板,第一件事不是点灯,而是把它切到 Direct Test Mode(DTM)里跑一趟射频指标。这个标题看着像是蓝牙协议栈里的一个冷门模式,实际上凡是做 BLE 产品的硬件工程师、射频调试工程师&…

作者头像 李华
网站建设 2026/9/2 3:32:18

STM32U5G9ZJT6Q Video Stop停止顺序详解与低功耗实现

做车载显示项目这几年,我有个习惯:一听到需求方提“Video Stop”,先追问一句“停到什么程度”。大多数时候,对方说的“停止播放视频”,心里真正想的其实只是“屏幕别再动画了”,但在 STM32U5G9ZJT6Q 这类集…

作者头像 李华
网站建设 2026/9/3 12:59:59

微信小程序+云开发:校园跑步社交系统的设计与实现

简介:这是一套面向计算机类本科毕业生的完整毕业设计资源,聚焦校园场景下的运动社交需求,提供从开发到答辩的全流程支撑材料。项目以微信小程序为载体,实现跑步轨迹记录、实时配速里程、整公里语音提醒、周/月排行榜、打卡分享、线…

作者头像 李华
网站建设 2026/9/2 12:11:35

别再来一个 Log4Shell:深入解析 Log4j 2 反序列化允许列表绕过

作者:来自 Elastic Ruben Groenewoud, Terrance DeJesus, Bryan Porras Blanch, Eric Forte 这不是另一个 Log4Shell。Log4Shell(CVE-2021-44228) 是由日志记录字符串触发的 JNDI 查找。而 8 月报告的这个绕过问题是 Log4j 2 的 FilteredObje…

作者头像 李华
网站建设 2026/9/2 8:25:52

表格识别:从「一行行文字」到「一格一格的表」--OnnxOCRRapidTable

表格识别:从「一行行文字」到「一格一格的表」–OnnxOCR&RapidTable 1、写在前面 8月初,整个东北笼罩在穹顶之下,酷热难耐之时,我到传奇小城鹤岗的客户现场出差,算是躲过了热浪。 我对这座城市最久远的印象应该是学…

作者头像 李华