基于matlab的零件图形分割。
打开MATLAB准备处理零件图像的时候,千万别直接上分割算法。手里的这张金属零件图,背景有油渍反光,零件边缘还有细微毛刺,直接处理大概率翻车。咱先整点预处理——把工具箱里的老伙计imread拽出来干活:
raw_img = imread('gear_part.jpg'); gray_img = rgb2gray(raw_img); figure, imshow(gray_img), title('预处理后的灰度图');转灰度这步看似简单,其实能干掉80%的干扰信息。有些兄弟喜欢保留彩色通道做处理,但零件图颜色差异不大时反而增加计算量。遇到过一张图转灰度后信噪比直接提升两倍的情况,效果堪比美颜滤镜。
基于matlab的零件图形分割。
边缘检测环节建议直接上Canny算子,MATLAB自带的edge函数调参很方便。不过参数设置要看具体情况,这张图光照不均,试试双阈值:
edge_map = edge(gray_img, 'Canny', [0.1, 0.3]); figure, imshow(edge_map), title('Canny边缘检测结果');这里的[0.1,0.3]是经验值。阈值太低会把噪点当边缘,太高又会漏检。碰到过极端案例,一张铝合金零件的边缘阈值得调到0.25才能准确捕捉到加工痕迹。检测完别急着高兴,这时候的边缘图八成都是断断续续的碎线。
上形态学处理补缺口才是正解。先膨胀连接边缘碎片,再腐蚀消除毛刺:
se = strel('disk', 2); % 创建圆形结构元素 dilated_edges = imdilate(edge_map, se); clean_edges = imerode(dilated_edges, se);结构元素选disk比rectangle好用,能更好保持圆弧特征。处理完发现有个别区域封闭不严实?可以叠buff——区域填充:
filled_edges = imfill(clean_edges, 'holes'); figure, imshow(filled_edges), title('形态学处理后');最后上分水岭算法前,建议先做个距离变换。这步能有效防止过分割,特别是处理带孔洞的齿轮类零件:
D = -bwdist(~filled_edges); mask = imextendedmin(D, 2); D2 = imimposemin(D, mask); L = watershed(D2);实测发现,当零件表面有规律性纹理时,传统阈值分割会误判,这时候改用区域生长法更靠谱。设定种子点时可以结合图像梯度,自动选取特征明显的区域:
gradient_img = imgradient(gray_img); [rows, cols] = find(gradient_img > max(gradient_img(:))*0.7); seed_points = [cols, rows]; % 注意坐标顺序处理完别急着收工,一定要做后处理。用bwareaopen去掉小面积噪点,比手动调参数高效得多:
final_seg = bwareaopen(filled_edges, 500); figure, imshow(labeloverlay(raw_img, final_seg)), title('最终分割效果');这套组合拳下来,基本能搞定90%的工业零件图。碰到特别妖的图(比如反光严重的曲面零件),记得上Hough变换找几何特征,或者切到HSV色彩空间处理金属反光区域。实践中最重要的是灵活搭配工具——没有万能算法,但有万能工具箱。