【机器视觉】基于MATLAB+Hough变换对工件尺寸检测

【机器视觉】基于MATLAB+Hough变换对工件尺寸检测

  • 前言
  • 正文
  • 程序
  • 参考文献

前言

声明:图片来自参考论文

大家好!这是我第一次写博客。本篇是根据数字图像处理的一次作业写的。有问题的地方欢迎指出。

正文

任务目标:检测图像中两个圆孔的圆心距和各自的半径。
方案:用MATLAB复现《基于机器视觉的二维尺寸检测》作者:谢俊,吴荥荥,朱广韬,王路路,来自杂志《工具技术》。
首先利用论文给出的10mm的标尺的图像确定实际尺寸和像素间的变换关系。

【机器视觉】基于MATLAB+Hough变换对工件尺寸检测_第1张图片
现将图像二值化图像再进行细化。

f = rgb2gray(f);%转灰度
f = im2bw(f);%二值化
figure;imshow(f);
f1 = bwmorph(f,'close',Inf);%由于有部分杂点先进行闭运算
f1 = bwmorph(f1,'thin',Inf);
两端的坐标分别为(242,145)和(255,202),算的直线像素为58.46,换算系数为0.1710mm/像素。
[y1 x1]= find(f1 ==1);
d = sqrt((x1(1) - x1(end) )^2 + (y1(1) - y1(end) )^2 );%求解直线两端坐标像素距离
k = 10/d;%像素与实际尺寸换算系数
工件原图像:

【机器视觉】基于MATLAB+Hough变换对工件尺寸检测_第2张图片
对图像二值化再取反细化:

g = rgb2gray(g);%转灰度
g = im2bw(g);%二值化
figure;imshow(g);
g1 = bwmorph(~g,'close',Inf);
g1 = bwmorph(g1,'remove',Inf);

【机器视觉】基于MATLAB+Hough变换对工件尺寸检测_第3张图片
利用Hough变换进行圆的检测并计算两圆的直径、圆心距和误差

[centers1, radii1, metric1] = imfindcircles(g1,[5 20]);%利用Hough变换检测小圆
[centers2, radii2, metric2] = imfindcircles(g1,[60 100]);%利用Hough变换检测大圆
d1 = radii1*k*2;%小圆直径
fprintf('小圆直径,%d\n',d1)
d2 = radii2*k*2;%大圆直径
fprintf('大圆直径,%d\n',d2)
D = sqrt((centers1(1) - centers2(1) )^2 + (centers1(2) - centers2(2) )^2 )*k;%两圆圆心距
fprintf('圆心距,%d\n',D)
error_d1 = abs(d1 - 3.28)/3.28;%小圆直径误差
fprintf('小圆直径误差,%d\n' , error_d1);
error_d2 = abs(d2 - 26.43)/26.43;%大圆直径误差
fprintf('大圆直径误差,%d\n' , error_d2);
error_D = abs(D - 17.50)/17.50;%圆心距误差
fprintf('圆心距误差,%d\n' , error_D);

小圆直径,3.916452mm
大圆直径,2.764583mm
圆心距,1.808321mm
小圆直径误差,0.1940402
大圆直径误差,0.04600180
圆心距误差,0.03332625
由于图片是从论文中复制粘贴过来的本身就带有误差,故个人认为结果还算准确。

程序

全部代码:

clear;clc;close all;
f = imread('10mm卡尺.jpg');
figure;imshow(f);
f = rgb2gray(f);%转灰度
f = im2bw(f);%二值化
figure;imshow(f);
f1 = bwmorph(f,'close',Inf);
f1 = bwmorph(f1,'thin',Inf);
figure;imshow(f1);
[y1 x1]= find(f1 ==1);
d = sqrt((x1(1) - x1(end) )^2 + (y1(1) - y1(end) )^2 );%求解直线两端坐标像素距离
k = 10/d;%像素与实际尺寸换算系数
g = imread('工件.jpg');
figure;imshow(g);
g = rgb2gray(g);%转灰度
g = im2bw(g);%二值化
figure;imshow(g);
g1 = bwmorph(~g,'close',Inf);
figure;imshow(g1);
g1 = bwmorph(g1,'remove',Inf);
figure;imshow(g1);
[centers1, radii1, metric1] = imfindcircles(g1,[5 20]);%利用Hough变换检测小圆
[centers2, radii2, metric2] = imfindcircles(g1,[60 100]);%利用Hough变换检测大圆
d1 = radii1*k*2;%小圆直径
fprintf('小圆直径,%d\n',d1)
d2 = radii2*k*2;%大圆直径
fprintf('大圆直径,%d\n',d2)
D = sqrt((centers1(1) - centers2(1) )^2 + (centers1(2) - centers2(2) )^2 )*k;%两圆圆心距
fprintf('圆心距,%d\n',D)
error_d1 = abs(d1 - 3.28)/3.28;%小圆直径误差
fprintf('小圆直径误差,%d\n' , error_d1);
error_d2 = abs(d2 - 26.43)/26.43;%大圆直径误差
fprintf('大圆直径误差,%d\n' , error_d2);
error_D = abs(D - 17.50)/17.50;%圆心距误差
fprintf('圆心距误差,%d\n' , error_D);

参考文献

[1]: 谢俊,吴荥荥,朱广韬,王路路.基于机器视觉的二维尺寸检测 [J] . 工 具 技 术,2017.01.026

你可能感兴趣的:(机器视觉,计算机视觉,cv,matlab)