
简介这份资源是2023届合肥工业大学电子信息科学与技术专业的毕业设计完整项目题目为基于机器视觉技术的液晶屏切割缺陷辅助检测系统面向计算机、人工智能、通信工程、自动化、电子信息等专业的在校学生、教师及企业员工适合作为毕设、课程设计、作业或项目初期立项演示的参考也适合具备一定基础的学习者进阶研究。压缩包共34个文件约13.49MB以25个Python源码文件为核心涵盖图像预处理、缺陷检测、模型训练与预测、界面交互等模块另含模型权重文件、字体、网页模板、说明文档及少量图片资源结构清晰便于按模块学习。项目基于Python 3.11与OpenCV实现代码均经测试运行成功答辩评审平均分达96分。已有251人学习下载读者可从中获取完整的机器视觉缺陷检测方案、模型训练与推理流程、界面实现思路及项目文档说明也可在此基础上修改扩展以实现其他功能。1. 液晶屏切割缺陷辅助检测从一张灰阶图到可复现的机器视觉方案液晶屏切割是面板后段工序里最容易被低估的环节。玻璃基板被刀轮或激光划出裂痕再施加压力掰断边缘会出现微裂纹、崩边、缺角、残屑。这些缺陷宽度常在几十微米量级人眼在强光下盯久了会疲劳漏检率随班次上升。基于机器视觉技术的液晶屏切割缺陷辅助检测系统要解决的就是把这件事从「靠眼睛」变成「靠算法先筛一遍人只复核可疑项」。它适合三类人做机器视觉缺陷检测的工程师、电子信息科学与技术专业的毕业设计选题者、以及想把产线抽检升级为全检的工艺人员。核心链路并不神秘——工业相机取图、光源把缺陷打亮、图像预处理、缺陷分割与分类、结果输出到界面或 PLC。真正难的是把这条链路在有限预算和有限算力下落成可复现的代码而不是停在论文框图里。2. 拆解检测链路从打光到像素精度每一步都在决定上限2.1 为什么切割缺陷检测的第一性问题是打光而不是算法很多人拿到题目先想用哪个网络我一般会先问缺陷在图像里长什么样。液晶屏切割边缘的微裂纹是暗细线崩边是亮暗交界的缺口残屑是随机分布的小颗粒。如果光源角度不对微裂纹和玻璃边缘的划痕在灰度上几乎不可分后面换什么模型都是玄学。常见做法是暗场照明加低角度环形光低角度让裂纹产生散射暗场让背景压黑缺陷以亮线形式跳出。对于崩边这种有深度变化的缺陷同轴光能保留边缘轮廓。实际产线常用组合光源用两路不同角度的光分时曝光再合成。这里要引入一个容易被忽略的参数像素精度。机器视觉动了什么会导致像素精度变化答案是视场、分辨率、工作距离三者联动。像素精度 视场宽度 / 相机横向分辨率。假设要检测 20 微米的裂纹按 3 像素判据像素精度要优于 7 微米。选 500 万像素相机2592×1944视场宽度就不能超过 18 毫米。这意味着镜头工作距离和视野被锁死光源也要跟着重新选型。很多毕设方案在论文里写「采用高分辨率相机」却不给这个换算到了实测发现裂纹只有一两个像素宽分割出来全是断点。提示先把像素精度算出来写在方案第一页再选相机和镜头顺序反了会反复翻车。2.2 图像预处理傅里叶变换和形态学各自解决什么问题拿到原始图后第一步不是直接送网络。切割缺陷检测的预处理通常包含三件事去噪、增强缺陷对比度、抑制周期性纹理。液晶屏表面可能有摩尔纹或光源条纹这些是周期性噪声空间域滤波很难干净去掉。机器视觉 图像傅里叶变换在这里有用把图像转到频域周期性条纹表现为特定频率的亮点用陷波滤波器压掉再逆变换回来。代码不复杂但参数要调。import cv2 import numpy as np def notch_filter(img_gray, radius8, centersNone): 频域陷波压掉周期性条纹centers 为需要抑制的频率中心列表 f np.fft.fft2(img_gray) fshift np.fft.fftshift(f) rows, cols img_gray.shape crow, ccol rows // 2, cols // 2 mask np.ones((rows, cols), np.uint8) if centers is None: centers [(crow, ccol)] # 默认只压直流附近实际要按频谱图填 for (r, c) in centers: cv2.circle(mask, (c, r), radius, 0, -1) fshift fshift * mask ishift np.fft.ifftshift(fshift) img_back np.abs(np.fft.ifft2(ishift)) return np.uint8(cv2.normalize(img_back, None, 0, 255, cv2.NORM_MINMAX))逻辑说明先做二维傅里叶变换并中心化构造一个全 1 掩膜在需要抑制的频率位置画圆置 0乘回频谱后逆变换。参数 radius 控制抑制带宽太小压不干净太大会把缺陷本身的边缘信息一起抹掉。centers 必须通过观察频谱图确定不能拍脑袋填。这一步之后通常接自适应直方图均衡CLAHE提升局部对比度再用形态学开运算去掉孤立噪点。形态学在切割缺陷里主要做两件事用开运算去掉比缺陷小的颗粒噪声用闭运算把断裂的裂纹连起来。结构元尺寸要略大于噪声、小于缺陷。如果裂纹宽 3 像素结构元用 2×2 或 3×3 椭圆用 5×5 会把细裂纹直接抹没。2.3 缺陷分割与分类传统方法和轻量网络的选型边界毕设场景下算力有限不必一上来就上大模型。常见做法是分两级先用传统方法做快速分割再用轻量分类网络判类别。分割可以用自适应阈值加轮廓筛选对预处理后的图做 Otsu 或自适应阈值提取轮廓按面积、长宽比、圆度过滤掉非缺陷区域。裂纹的长宽比很大崩边的圆度偏低残屑面积小且分散。这套规则在缺陷形态稳定时够用代码量小可解释性强。def extract_defects(binary, min_area15, max_area5000): 从二值图中提取候选缺陷返回轮廓和属性 contours, _ cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) results [] for cnt in contours: area cv2.contourArea(cnt) if area min_area or area max_area: continue x, y, w, h cv2.boundingRect(cnt) aspect max(w, h) / max(min(w, h), 1) results.append({bbox: (x, y, w, h), area: area, aspect: aspect}) return results参数说明min_area 取决于像素精度按最小缺陷面积乘安全系数定max_area 用来排除整片暗区误检aspect 后续用于区分裂纹和崩边。如果缺陷形态变化大规则法会漏检这时再引入轻量网络。机器视觉学习笔记之卷神经网络里常提的 MobileNet 或 ShuffleNet 可以做分类头输入 64×64 的缺陷 patch输出四类。训练数据靠人工标注加数据增强旋转、缩放、加噪。注意不要用 ImageNet 预训练权重直接微调就完事工业缺陷和自然图像分布差很远至少要用自己的数据跑够 epoch。3. 把系统跑起来从环境搭建到界面输出的完整步骤3.1 环境与依赖Python 版本、OpenCV 和推理框架怎么配这套系统我一般用 Python 3.8 到 3.10太新的版本某些工业相机 SDK 跟不上。核心依赖是 opencv-python、numpy、scikit-image如果要跑网络再加 onnxruntime 或 torch。不建议在毕设环境里装完整 CUDA 全家桶除非确定有显卡。CPU 推理一张 640×480 的图轻量网络在几十毫秒量级辅助检测够用。python -m venv venv source venv/bin/activate # Windows 用 venv\Scripts\activate pip install opencv-python numpy scikit-image onnxruntime逻辑说明虚拟环境隔离依赖避免和系统里其他项目冲突。onnxruntime 选 CPU 版即可安装包小、部署简单。如果相机厂商提供 Python SDK按厂商文档单独装不要混在 requirements 里锁死版本。3.2 从相机取图到缺陷标注的端到端脚本下面是一个最小可运行的主流程把取图、预处理、分割、标注串起来。实际项目里取图部分换成相机 SDK 的回调或触发采集。import cv2 import numpy as np def preprocess(img): gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) clahe cv2.createCLAHE(clipLimit2.0, tileGridSize(8, 8)) enhanced clahe.apply(gray) blur cv2.GaussianBlur(enhanced, (3, 3), 0) return blur def segment(blur): binary cv2.adaptiveThreshold(blur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 25, 8) kernel cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3)) binary cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel) binary cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel) return binary def annotate(img, defects): for d in defects: x, y, w, h d[bbox] cv2.rectangle(img, (x, y), (x w, y h), (0, 0, 255), 1) return img if __name__ __main__: img cv2.imread(cut_sample.jpg) blur preprocess(img) binary segment(blur) defects extract_defects(binary) vis annotate(img.copy(), defects) cv2.imwrite(result.jpg, vis) print(f检出候选缺陷 {len(defects)} 处)逻辑说明preprocess 做灰度、CLAHE 增强、高斯去噪segment 用自适应阈值反向二值化让暗缺陷变白再开闭运算清理extract_defects 复用前面的轮廓筛选annotate 画框输出。参数里 adaptiveThreshold 的 blockSize 取 25 是经验值图小就调小图大就调大但必须是奇数。C 值 8 控制阈值偏移缺陷对比度低就调小噪声多就调大。3.3 结果输出与辅助判定界面、日志和 PLC 信号辅助检测的「辅助」二字体现在人机交互上。常见做法是用 PyQt 或 Tkinter 做一个简单界面左边显示原图右边显示标注结果下方列出缺陷坐标和类别操作员点「确认」或「误检」。确认的数据回流成训练集这是系统越用越准的关键。如果产线要联动把结果通过串口或 Modbus 发给 PLC合格放行、可疑停机。日志要记录时间戳、图片路径、缺陷数量和人工复核结果方便追溯。注意界面线程和图像处理线程要分开否则处理一张图界面就卡死操作员会直接弃用。4. 避坑与排查那些让毕设演示当场翻车的细节4.1 现象同一批样品白天检出、晚上漏检原因环境光混入。低角度暗场照明对环境光极敏感车间窗户或顶灯变化会改变背景灰度自适应阈值的基准跟着漂。解决加遮光罩或改用带频闪同步的光源控制器只在曝光瞬间亮灯。软件上可以加背景建模每采一批图更新一次背景。4.2 现象裂纹分割出来是断续的点连不成线原因形态学闭运算结构元太小或阈值把裂纹中段较暗的部分判成背景。解决先确认裂纹在增强后的灰度是否连续不连续就调 CLAHE 的 clipLimit再适当放大闭运算结构元但不要超过裂纹宽度的两倍。4.3 现象模型训练准确率很高实测一塌糊涂原因训练集和测试集来自同一批样品没有跨批次划分。工业缺陷的分布随刀具磨损、玻璃批次变化。解决按生产批次或时间划分训练集和验证集至少留一批完全没见过的样品做测试。数据增强要模拟真实变化比如亮度抖动、轻微模糊、对比度变化。4.4 现象程序跑几十分钟后内存暴涨原因OpenCV 的 Mat 或图像列表没有释放或者日志把每张图都存进内存。解决处理完及时 del 并调用 gc.collect日志只存路径和结果图片定期落盘清理。用循环缓冲区限制内存中保留的图片数量。4.5 现象换一台电脑结果就不一样原因依赖版本不一致尤其是 OpenCV 和 numpy 的版本差异会影响数值计算。解决用 requirements.txt 锁版本或者用 Docker 打包环境。毕设答辩前在答辩电脑上完整跑一遍别只带代码不带环境。5. 进阶技巧用少量标注把检测精度再推一档如果规则法加轻量分类的精度还不够可以试半监督或主动学习。核心思路是让模型挑出它最不确定的样本人工只标这些再增量训练。具体做法对每个候选缺陷模型输出各类概率取最大概率低于阈值或熵高于阈值的样本送人工复核。这样标注量能降一半以上。另一个技巧是缺陷合成把真实缺陷裁剪出来随机贴到正常区域上生成带标注的合成样本扩充训练集。注意合成时要匹配光照和噪声分布否则模型学到的是贴图痕迹而不是缺陷特征。验证方法上不要只看准确率。缺陷检测更该看召回率和误检率召回率低会漏检误检率高操作员会烦。我一般要求召回率优先误检靠人工复核兜底。测试时按缺陷类型分别统计裂纹、崩边、残屑各自算别混在一起看总数。我自己踩过最深的坑是早期太信算法忽略了打光和像素精度的换算结果模型在实验室样片上表现很好到了产线样品上裂纹只有一像素宽分割全是断点。后来把光源和镜头重新选了一遍算法几乎没改效果就上来了。做这类系统先把物理链路算清楚再写代码顺序对了能省很多后悔药。希望帮到你。本文还有配套的精品资源点击获取