标题:基于matlab的图像处理实践 关键词:otsu 非均匀照度 光照补偿 log函数和gamma函数 Dice和Hausdorff测度 工件有孔,无孔进行分类 中心点标记 描述:主要是使用图像处理算法处理非均匀光照图像,进行光照模型补偿,展示图像灰度直方图,并对图像进行阈值分割,展示二值图。 之后对工件的有孔和无孔进行标记和使用不同颜色对工件分类,并计算出各个工件的中心位置。
在金属加工车间里,我们常会遇到这样的场景:零件表面的反光让质检摄像头拍出明暗不均的图像。就像这张铝制工件的现场图,左侧的顶灯在零件表面形成明显的光斑,直接使用Otsu阈值分割会把阴影区域误判为孔洞。今天咱们用MATLAB拆解这个棘手问题。
光照补偿的左右互搏
面对非均匀光照,先祭出直方图均衡化:
`matlab
img = imread('workpiece.jpg');
img_eq = histeq(img);
imshowpair(img, img_eq, 'montage');
`
但发现高光区域细节反而丢失。改用对数变换试试:
`matlab
c = 0.6;
log_trans = c * log(1 + double(img));
`
此时阴影细节浮现了,但整体对比度下降。这时gamma校正杀出重围:
`matlab
gamma = 2.5;
img_gamma = imadjust(img,[],[],1/gamma);
`
通过滑动gamma值观察效果,发现当gamma=1.8时,能同时保留高光和阴影的纹理特征。这种参数调优过程就像老中医把脉,需要结合具体场景反复尝试。
阈值分割的攻防战
补偿后的图像灰度直方图呈现双峰特征,但右侧峰明显比左侧"肥胖"。直接全局阈值分割:
`matlab
thresh = graythresh(img_gamma);
bw = imbinarize(img_gamma, thresh);
`
结果在明暗交界处产生锯齿状边缘。改用局部自适应阈值:
`matlab
bw = imbinarize(img_gamma, 'adaptive','Sensitivity',0.4);
`
参数Sensitivity调到0.35时,边缘平滑度显著提升。这里有个经验:当处理金属反光表面,Sensitivity取值建议在[0.3,0.45]区间滑动测试。
孔洞侦探的形态学工具箱
对于孔洞检测,先进行形态学开运算去除噪点:
`matlab
se = strel('disk',3);
bw_clean = imopen(bw,se);
`
之后用孔洞填充技术反推孔洞位置:
`matlab
bwfilled = imfill(bwclean,'holes');
holes = bwfilled & ~bwclean;
`
这里有个坑:当工件本身存在凹陷结构时,需要结合区域面积阈值过滤假孔洞。我们通过统计连通区域面积,设定当孔洞面积在[15,200]像素区间时才视为有效孔。
让零件自己说话的标记术
最后的可视化环节充满趣味:
`matlab
stats = regionprops(bw_clean,'Centroid','Area');
for k = 1:length(stats)
if holes_flag(k) % 孔洞标记判断
text(stats(k).Centroid(1), stats(k).Centroid(2),...
'○','Color','r','FontSize',14)
else
plot(stats(k).Centroid(1), stats(k).Centroid(2),...
'g+','MarkerSize',12)
end
end
`
用Dice系数评估分割结果时发现,当Hausdorff距离控制在3个像素以内,人眼几乎无法分辨差异。这种量化评估方法让算法优化有了明确的方向标。
整个处理流程跑下来,最大的感悟是:图像处理就像在光与影之间走钢丝,既要用数学工具建立模型,又要保持对物理世界的敬畏。当看到那些精确标定的中心点坐标在屏幕上闪烁时,仿佛听见了工业零件在数字世界的呢喃低语。