禅城区城乡建设局网站,无锡网站推广$做下拉去118cr,正定县建设局网站,学网站建设要多长时间1. 什么是Mura缺陷#xff1f;从屏幕到高纹理表面的挑战 大家好#xff0c;我是老张#xff0c;在机器视觉和工业质检这行摸爬滚打了十几年#xff0c;用过不少软件#xff0c;Halcon算是我的老朋友了。今天想和大家深入聊聊一个听起来有点“玄乎”#xff0c;但在实际生…1. 什么是Mura缺陷从屏幕到高纹理表面的挑战大家好我是老张在机器视觉和工业质检这行摸爬滚打了十几年用过不少软件Halcon算是我的老朋友了。今天想和大家深入聊聊一个听起来有点“玄乎”但在实际生产中又特别让人头疼的问题——在高纹理图像里找Mura缺陷。这活儿说难是真难但一旦摸清了门道又会觉得特别有意思。Mura这个词最早是从屏幕显示行业来的日语里是“斑”的意思。你可以想象一下你新买的手机屏幕在纯色背景下是不是偶尔能看到一小块颜色不太均匀、像云团一样的暗斑或亮斑那就是Mura。后来这个概念被扩展到了整个表面检测领域。比如一块高级皮革上纹理本身就很复杂但偏偏有一小块区域的纹理“糊”了光泽度不一样或者一块半导体磨砂面上出现了一团不该有的、与周围砂面质感不同的区域。这些我们都可以广义地称为Mura缺陷。它的核心特点就是“团块状”和“与背景融为一体却又不同”。说它“融为一体”是因为它的灰度值、颜色往往和背景纹理处于同一个范围你用肉眼乍一看甚至用简单的阈值分割比如设定一个灰度范围把范围内的像素都选出来根本分不清哪是纹理、哪是缺陷。说它“不同”是因为它在局部区域的灰度分布、均匀性上和正常的背景纹理存在细微的差异。这种“似是非是”的特性就是检测它最大的难点。我遇到过不少工程师一上来就用threshold加connection再加点opening_circle之类的形态学操作结果要么是把整片纹理都当成了缺陷要么就是根本抓不到真正的Mura。背景纹理越复杂、越随机比如木材纹、布纹、粗糙的金属表面常规方法就越容易“失灵”。当然如果背景纹理比较浅、比较规则用mean_image均值滤波先平滑一下再用dyn_threshold动态阈值去扣有时候也能有不错的效果。但这属于“运气好”碰上高纹理背景这招就不太管用了。所以今天我们就聚焦于那个最棘手的场景背景纹理又密又复杂缺陷就藏在这些纹理里面怎么把它揪出来Halcon官方其实给了一个非常经典的例子detect_mura_defects_texture.hdev它提供了一套完整的解决思路。接下来我就结合自己踩过的坑和实战经验把这个例子的里里外外掰开揉碎了讲给你听并补充一些官方例子没细说但实际应用中至关重要的细节。2. 思路破局为什么要在频域里“抹平”背景面对一张布满复杂纹理的图片我们人眼有时候能隐约感觉到哪里“不对劲”但让机器明确指出来却很难。这是因为机器最初看到的是一大堆混杂在一起的信号既有我们关心的缺陷信号也有强烈的、我们不想要的背景纹理信号。想要检测缺陷最直接的思路就是把背景信号削弱或者消除让缺陷信号凸显出来。Halcon官方例子的核心智慧就在这里它不是在空间域就是我们平常看的图像里硬算而是巧妙地跑到了频域里去处理。这步操作是整个流程的灵魂。我刚开始学的时候对“频域”也是发怵的觉得又是傅里叶变换又是滤波器太数学了。但后来我想明白了一个简单的类比你肯定能懂想象一下你在一个非常嘈杂的菜市场里想听清远处一个朋友叫你的声音。周围全是讨价还价、吆喝叫卖的声音这就是高频的背景纹理。你朋友的声音低频的、平缓变化的Mura缺陷被完全淹没了。这时候怎么办一个办法是你找个大喇叭对着菜市场喊“大家都小点声”。这相当于一个低通滤波器它把那些尖锐、高频的吵闹声背景纹理给压低了而相对平缓、低频的朋友叫喊声缺陷就相对变得清晰了。把这个道理放回图像处理图像的背景纹理通常对应着图像中灰度变化剧烈、频率较高的成分比如布料的经纬线交叉点、皮革的细小纹路。而Mura缺陷通常是一片区域内灰度变化缓慢、均匀的成分一块颜色略深或略浅的斑块。那么如果我们能设计一个“滤波器”把图像中高频的部分背景纹理过滤掉只留下低频的部分背景光照缺陷是不是就离目标近了一步官方例子里的estimate_background_illumination这个自定义函数干的就是这个事儿。它内部的核心步骤是转到频域使用rft_generic(实值快速傅里叶变换) 把图像从空间域转换到频域。到了频域图像中不同频率的成分就被分离开了我们可以针对性地处理。应用低通滤波器使用gen_gauss_filter生成一个高斯低通滤波器。这个滤波器的关键参数是Sigma标准差。Sigma值越大生成的高斯滤波器“越胖”允许通过的低频成分越多过滤掉的高频成分也越多平滑效果就越强。卷积与转回在频域里用这个高斯滤波器与图像进行卷积 (convol_fft)相当于把高频细节抹平。最后再用rft_generic把处理后的结果从频域转回空间域。我实测下来Sigma值的选取是这一步成败的关键。官方例子用了50这个值相当大。我做过对比实验Sigma50生成的背景图像非常模糊几乎只剩下最粗略的光照变化。原图中那些细密的纹理几乎看不见了。这样做的目的是尽可能彻底地移除纹理只保留最“基础”的背景。Sigma5生成的背景图像还能看到一些纹理的“影子”平滑得不够彻底。怎么理解这个区别呢你可以把高斯滤波器想象成一个筛子。Sigma50是个网眼非常大的筛子只留下最大的石块最低频的背景光照Sigma5的网眼小一些除了大石块还留下了一些小石子部分中低频纹理。我们的目的是要得到最“干净”的背景所以通常需要选择较大的Sigma值确保所有纹理都被当成“高频噪声”筛掉。但也不能无限大否则图像会过度模糊丢失有用的全局光照信息。2.1 一个容易被忽略的细节图像数据类型的选择在从频域转回空间域时rft_generic有一个参数用来指定输出图像的类型比如‘byte’(0-255),‘real’(浮点数),‘uint2’(16位无符号整数) 等。这个选择看似不起眼却对后续处理有巨大影响。我踩过这个坑。有一次我图省事一直用‘byte’类型。后来处理一批对比度极低的Mura图像时发现缺陷怎么都提取得不干净。排查了很久才发现问题出在这里。‘byte’类型只有256个灰度级在从浮点数的频域计算结果转换过来时会进行舍入和截断可能损失掉非常细微的灰度差异。而Mura缺陷与背景的差异往往就隐藏在这些细微的灰度变化里。换成‘real’类型后图像保留了完整的浮点精度后续做差分、增强时这些细微的差异被放大了缺陷特征一下子就清晰了很多。所以我的经验是在内存允许的情况下尽量在中间处理步骤使用‘real’类型直到最后需要显示或二值化时再考虑转换到‘byte’。这能最大程度保留图像的动态范围和信息。3. 实战拆解一步步“揪出”隐藏的Mura理论说再多不如上手干。我们跟着官方例子的代码一步步走一遍看看每一步图像到底发生了什么变化。假设我们已经读入了图像并且按照前面说的对蓝色通道B通道通常在高纹理彩色图像中某个通道的缺陷对比度会更高进行了背景估计得到了一个非常平滑的背景图像ImageFFT1。3.1 差分放大让缺陷“浮出水面”第一步是做减法。用原始B通道图像B减去我们估计出的纯背景图像ImageFFT1。sub_image (B, ImageFFT1, ImageSub, 2, 100)这行代码的sub_image操作公式大致是ImageSub (B - ImageFFT1) * Mult Add。这里Mult2,Add100。B - ImageFFT1这一步是精髓。你想B包含了背景光照 背景纹理 缺陷。ImageFFT1是我们估计的背景光照。两者一减理想情况下背景光照被减掉了剩下的是背景纹理 缺陷。但因为我们估计的背景光照是通过强低通滤波得到的它其实也带走了一部分纹理的“基底”信息所以这个减法操作在消除光照不均的同时也极大地削弱了背景纹理的强度而缺陷部分则被相对保留甚至凸显出来。Mult2这是一个放大因子。把差分后的结果乘以2目的是增强缺陷与剩余背景纹理之间的对比度。就像把声音放大一样让细微的差异变得更明显。Add100这是一个偏移量。因为差分后图像可能有负值乘以倍数后数值范围也可能很怪。加上100对于byte图像相当于中间灰度值是为了把图像的灰度整体调整到一个合适的可视范围方便我们观察和后续处理。做完这一步你再看ImageSub图像会发现原来那些嚣张的背景纹理变得“虚弱”了很多像一层淡淡的薄雾。而Mura缺陷区域则开始显现出与这层“薄雾”不同的灰度特征。3.2 中值滤波最后的“降噪”与平滑差分后的图像ImageSub里背景纹理虽然弱了但可能还有一些零星的噪声点或纹理残留。为了进一步让缺陷区域变得连贯、平滑同时抑制这些孤立的噪声官方例子使用了中值滤波。median_image (ImageSub, ImageMedian, ‘circle’, 9, ‘mirrored’)median_image中值滤波是个“保边去噪”的好手。它用一个圆形的结构元素这里半径是9在图像上滑动。在每个位置它把这个圆形区域内的所有像素灰度值排序取中间的那个值中位数作为输出。这样做的好处是能有效滤除椒盐噪声那些特别亮或特别暗的孤立点很容易被周围的“正常”值替代。能平滑均匀区域像Mura缺陷这种内部灰度比较均匀的团块经过中值滤波后会变得更加均匀。相对保护边缘相比均值滤波它不会让边缘变得过于模糊。参数‘mirrored’指的是边缘处理方式对于图像边缘的像素通过镜像的方式虚拟出像素来处理这通常能获得比简单补零更好的边界效果。经过这一步处理ImageMedian图像就干净多了背景趋于平整缺陷区域成为图像中最突出的“小山丘”或“小洼地”。3.3 特征提取从“像缺陷”到“是缺陷”到了这一步缺陷在视觉上已经比较明显了。新手朋友可能会迫不及待地直接用threshold进行分割。这当然可以尝试但鲁棒性不够。因为不同图片的亮度、对比度可能有差异固定阈值很难适应所有情况。动态阈值dyn_threshold可能稍好一些但它依然依赖于一个合适的参考图像。官方例子采用了一种更高级、也更稳定的方法分水岭分割 灰度共生矩阵特征筛选。这招有点“组合拳”的意思。watersheds_threshold (ImageMedian, Basins, 20)watersheds_threshold可以看作是一种自适应阈值分割。它先计算图像的梯度然后像模拟水流汇聚一样找到一个个“集水盆地”Basins。参数20是一个灰度阈值用于控制哪些“盆地”会被合并。它能把图像分割成一个个连通区域这些区域之间的边界通常位于灰度变化剧烈的地方。经过前面的处理缺陷区域和背景的边界正好符合这个条件。但分水岭分割出来的区域很多其中既包含我们想要的缺陷区域也包含一些残留的背景纹理区域。怎么区分它们这里就用到了纹理分析的一个利器——灰度共生矩阵GLCM。cooc_feature_image (Basins, ImageMedian, 6, 0, Energy, Correlation, Homogeneity, Contrast)这行代码为每一个Basins区域计算其在原图ImageMedian上的灰度共生矩阵特征。参数6定义了灰度级数将图像灰度压缩到6级加快计算并突出主要纹理模式0是计算方向0度方向。它会输出好几个特征值官方例子主要关注Energy能量。能量反映了图像灰度分布的均匀程度和纹理的粗细。纹理越均匀、越粗糙能量值越高纹理越杂乱、越细碎能量值越低。Mura缺陷区域内部通常灰度非常均匀就像一块纯色色块所以它的能量值会很高。而那些复杂的背景纹理区域即使被平滑过其内部灰度仍然存在一些变化相对杂乱所以能量值较低。这样我们就能设定一个阈值比如select_shape (Regions, SelectedRegions, ‘energy’, ‘and’, 0.8, 1.0)把能量值高的区域即均匀的Mura缺陷筛选出来。这个方法的妙处在于它利用的是缺陷区域的内在属性均匀性而不是绝对的灰度值因此对于光照变化、图像整体明暗变化都有很好的适应性。4. 参数调优与避坑指南我的实战经验把流程跑通只是第一步要让它在你的实际产线上稳定运行参数调优和避坑是关键。下面这张表是我总结的几个核心步骤的关键参数、作用以及调优心得你可以保存下来参考处理步骤关键函数/操作核心参数参数作用与影响调优经验与避坑提示背景估计gen_gauss_filterSigma高斯滤波器标准差。值越大滤波效果越强背景越平滑纹理去除越彻底。这是最重要的参数需要根据背景纹理的“细腻”程度调整。纹理越密、越细Sigma需要越大如40-80。但过大可能导致缺陷边缘也被平滑。建议从30开始试观察生成的背景图是否完全抹去了纹理。背景估计rft_generic输出类型指定从频域转回空间域后图像的数据类型如‘byte’,‘real’。强烈建议用‘real’。保留浮点精度能最大限度保留差分后的细微灰度差异避免在‘byte’转换中损失信息导致后续对比度增强效果打折。差分增强sub_imageMult,AddMult放大对比度Add调整输出灰度偏移。Mult通常大于1用于拉伸缺陷与背景的差异。可从1.5开始尝试观察差分图。Add用于将图像调整到合适的灰度中间值便于观察一般设为100-128。中值滤波median_image掩模半径/尺寸中值滤波器的半径如‘circle’, 9。决定平滑的邻域大小。半径太小去噪不平滑半径太大可能模糊缺陷边缘。原则是略大于背景噪声点的尺寸但小于最小缺陷的尺寸。对于细小纹理残留半径5-15是常用范围。区域分割watersheds_threshold灰度阈值控制分水岭“盆地”合并的阈值影响最终分割区域的粒度。值越小分割出的区域越多、越细碎值越大区域越少、越大块。需要让缺陷区域能被完整地分割成一个或几个区域而背景不要被分割成太多碎块。从10-30开始调试。特征筛选cooc_feature_imageselect_shape灰度级数、特征阈值灰度级数压缩计算量特征阈值如Energy用于筛选。灰度级数一般用4, 6, 8即可太多计算慢且易受噪声干扰。Energy阈值需要根据实际缺陷的均匀性来定。先计算所有区域的Energy值观察缺陷区域和非缺陷区域的分布再确定一个合适的阈值范围。注意所有参数都没有“银弹”必须用你的实际缺陷样本图进行调试。最好的方法是准备一个包含典型OK和NG图片的小数据集写一个循环脚本微调关键参数尤其是Sigma和Energy阈值直观地观察每一步的中间结果和最终分割效果。除了参数还有几个常见的坑通道选择例子用了B通道但你的图像可能是在R或G通道上缺陷对比度更高。一定要用decompose3分离开三个通道分别用estimate_background_illumination处理看看效果选那个缺陷最明显的通道。光照不均如果原始图像本身就有严重的光照不均比如一边亮一边暗频域滤波估计出的背景可能不准。强烈建议在拍摄图像时就用好光源尽可能保证光照均匀。硬件上的问题软件解决起来事倍功半。缺陷多样性有的Mura缺陷对比度极低用sub_image的Mult放大后依然不明显。这时可以尝试在差分后使用emphasize或scale_image等灰度增强算子进一步拉伸局部对比度。运行速度频域变换和卷积计算量较大对于实时性要求高的产线需要评估处理速度。可以尝试降低图像分辨率在保证缺陷可检的前提下或者优化ROI只处理可能出缺陷的区域。这套方法的核心思想是“抑纹增缺”—— 抑制背景纹理增强缺陷特征。它为我们处理高纹理背景下的低对比度缺陷提供了一个非常强大的框架。理解了频域滤波的思想你甚至可以尝试用其他方法如小波变换、同态滤波来估计背景用其他纹理特征如熵、对比度来筛选缺陷。多动手试多分析中间结果你就能越来越得心应手。