基于Matlab的螺丝轮廓识别:数字图像处理流程
基于matlab的螺丝轮廓识别matlab数字图像处理。 对输入图像进行灰度化滤波平滑操作然后进行阈值化分割成二值图像之后对图像进行图像的形态学操作最终使用边缘检测算法提取边缘最终获得十字螺丝轮廓。直接上干货。最近在折腾工业零件的图像识别发现十字螺丝的轮廓提取是个挺有意思的挑战。咱们用Matlab来整这事儿先准备好螺丝的俯拍图最好是带点反光或轻微锈迹的真实场景图。基于matlab的螺丝轮廓识别matlab数字图像处理。 对输入图像进行灰度化滤波平滑操作然后进行阈值化分割成二值图像之后对图像进行图像的形态学操作最终使用边缘检测算法提取边缘最终获得十字螺丝轮廓。第一步灰度化处理别小看这个基础操作。彩色图转灰度可不是简单求平均得用加权公式gray_img rgb2gray(original_img); % 实际处理中发现红通道对金属反光更敏感 % 有时候手动调整系数效果更好 custom_gray 0.6*original_img(:,:,1) 0.3*original_img(:,:,2) 0.1*original_img(:,:,3);遇到强反光时传统灰度化可能丢失边缘细节。这时候做个直方图均衡化能救场adjusted_img histeq(gray_img); imshowpair(gray_img, adjusted_img, montage)滤波环节建议用中值滤波对付金属划痕特别管用。注意窗口尺寸别太大3x3刚好能去掉噪点又保留十字凹槽filtered_img medfilt2(adjusted_img, [3 3]); % 高斯滤波试过会模糊边缘果断放弃 % fspecial(gaussian,[5 5],1.5) 效果对比明显阈值分割是重头戏。全局阈值容易跪在光照不均上试试自适应阈值binary_img imbinarize(filtered_img, adaptive, Sensitivity, 0.6); % Sensitivity参数得看着直方图调0.4-0.7之间反复横跳 % 遇到阴阳脸半边亮半边暗的情况上局部阈值 block_size 50; local_thresh_img imbinarize(filtered_img, adaptive, ForegroundPolarity,dark,Sensitivity,0.4);形态学操作要讲究策略。先开运算去毛刺再闭运算填凹槽se strel(disk,2); opened_img imopen(binary_img, se); closed_img imclose(opened_img, strel(rectangle,[5 3])); % 十字结构元素的骚操作 cross_se strel(diamond,1).Neighborhood | strel(line,5,90).Neighborhood; custom_morph imerode(closed_img, cross_se);最后Canny边缘检测收尾edges edge(custom_morph, Canny, [0.1 0.2], 1.5); % 双阈值参数得看着螺丝尺寸调小螺丝用[0.05 0.1] % 加个形态学梯度强化边缘 [~, threshold] edge(custom_morph, sobel); fudge_factor 0.5; edge_enhanced edge(custom_morph,sobel, threshold * fudge_factor);实测发现金属螺丝的螺纹边缘容易产生伪影。这时候在形态学操作前加个区域填充有奇效filled_img imfill(closed_img, holes); % 注意别把十字槽给填平了填完再腐蚀一次 final_morph imerode(filled_img, strel(disk,1));整套流程跑下来能在90%的工况下准确抓出十字轮廓。剩下的10%得靠加入HSV色彩空间检测金属区域不过那就是另一个故事了。最后放个效果对比图原图跟提取的轮廓叠在一起看成就感直接拉满imshowpair(original_img, edges, blend)
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2409203.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!