matlab下对齿轮图片的参数提取
matlab下对齿轮图片的参数提取
目标:基于matlab对下面图片的各个参数进行提取
图片预处理:
首先读入图片,二值化,用canny算子边缘提取,由于接下来要用与中心提取,细化边缘。
代码:
bw1=imread('gear.bmp'); %读取图片 subplot(2,2,1); imshow(bw1);%展示读取到的图片 bw2=im2bw(bw1);%将图片二值化 subplot(2,2,2); imshow(bw2);%展示二值化后的图片 bw3=edge(bw2,'canny');%对二值化的图片边缘提取 subplot(2,2,3); imshow(bw3);%展示边缘提取后的图片 bw4 = bwmorph(bw3,'remove');%对边缘提取后的图片进行细化 subplot(2,2,4); imshow(bw4);%展示细化提取后的图片
结果:
边缘追踪获得齿轮边缘以及内圆的像素值:
代码:
figure;%另开一个图像窗口验证边缘追踪的结果是否正确 imshow(bw4); x1 = 314; y1 = 132;%由之前运行结果可以查bw4的数值,该点应该在齿轮边缘上,由该点开始边缘追踪 gearline = bwtraceboundary(bw4,[x1 y1],'E');%使用边缘追踪函数获得齿轮部分的坐标 hold on plot(gearline(:,2),gearline(:,1),'g','LineWidth',2);%在图像中用绿线展示,验证是否提取成功 x2=250; y2=315; circle = bwtraceboundary(bw4,[x2 y2],'NE');%使用边缘追踪函数获得内孔部分的坐标 hold on plot(circle(:,2),circle(:,1),'r','LineWidth',2);%在图像中用红线展示出来,验证是否提取成功
结果:
追踪成功。
计算中心点:
思想:
中心点可以认为是齿轮边缘线的所有点的平均值,也可以是内圆所有点的平均值。分别计算并且在图像中展示,可以清楚的看到二者的区别。由于内圆的像素点更为规整,在之后的计算中采用内圆像素点平均值作为中心点计算。
代码:
[n,~]=size(gearline); centerx1=0; centery1=0; for i=1:n centerx1=centerx1+gearline(i,2); centery1=centery1+gearline(i,1); end centerx1=centerx1/n; centery1=centery1/n; hold on plot(centerx1,centery1,'g*'); %内圆部分 [n,~]=size(circle); centerx2=0; centery2=0; for i=1:n centerx2=centerx2+circle(i,2); centery2=centery2+circle(i,1); end centerx2=centerx2/n; centery2=centery2/n; hold on plot(centerx2,centery2,'r*');
结果
放大后为:
分析:
二者的差距并不大,可见先前的运算结果应较为准确。
计算齿顶圆,齿根圆半径:
思想:
由先前求得的中心点位置,可以计算齿轮边缘线上各个点到中心的距离,以一个较小的区间为误差值,统计各个点到中心的距离在各个区间内的个数,数量最多的两个区间值即为齿顶圆和齿根圆半径。区间的大小应该为误差。
代码:
%计算齿轮边缘各点到中心的距离 [m,~]=size(gearline); for i=1:m gearline(i,3)=sqrt((gearline(i,2)-centerx2)^2+(gearline(i,1)-centery2)^2); end maxx=max(gearline(:,3)); minn=min(gearline(:,3)); l=minn:0.5:maxx; %从距离最小值到最大值以0.5为区间对各个值计数,打印出结果观察 for i=1:size(l,2)-1 num(i)=length(find(gearline(:,3)>l(i)&gearline(:,3)<l(i+1))); end figure; num(size(l,2))=0; plot(l,num);
结果:
以0.5为单位分别计数:
以1为单位分别计数
以2为单位计数:
计数个数最多的区间即为齿顶圆和齿根圆半径的值,其精确度即为区间大小.
结论:
齿根圆半径为207.8,齿顶圆半径237.8
计算齿数:
思想:
直接打印gearline(:,3)即齿轮边缘线到中心点的距离有下图:
设置与最大值和最小值距离10为安全值避免误触发,统计正向进入该区间次数,即可得齿数。
即在小于(min+10)时将标志boo置为1,在大于(max-10)且标志boo为1时count自加计数,且将boo重新置0;
代码:
maxx=max(gearline(:,3)); minn=min(gearline(:,3)); boo=0; count=0; for i=1:m if gearline(i,3)<(minn+10) boo=1; end if (gearline(i,3)>(maxx-10)) && (boo==1) count=count+1; boo=0; end end
结果:
28
与手工计数结果吻合
计算分度圆直径:
思想:
由最大值最小值之间以可接受的误差(此处用0.2)为距离,穷举计算不同半径大小下齿厚之和与齿间隙之和。使齿厚和与齿间隙和之差取最小值的半径大小,即为分度圆半径。
代码:
error=0;ee=0; for i=floor(minn)+5:0.2:ceil(maxx)-5 %i即为假定半径值 cc=1;dd=1; for j=1:m-1%求取假定半径下不同侧的齿轮边缘线与假设半径的交点编号,分别保存在intersection1,2数组下 if gearline(j,3)<i && gearline(j+1,3)>i intersection1(cc)=j; cc=cc+1; end if gearline(j,3)>i && gearline(j+1,3)<i intersection2(dd)=j+1; dd=dd+1; end end chixi=0;%对齿厚,齿间隙赋初始值 chihou=0; ee=ee+1; for j=1:26 chixi=chixi+sqrt((gearline(intersection1(j),1)-gearline(intersection2(j),1))^2 +(gearline(intersection1(j),2)-gearline(intersection2(j),2))^2); chihou=chihou+sqrt((gearline(intersection1(j+1),1)-gearline(intersection2(j),1))^2 +(gearline(intersection1(j+1),2)-gearline(intersection2(j),2))^2); end error(ee,1)=abs(chihou-chixi); %记录当前假定半径下的误差值 error(ee,2)=i;%记录当前假定半径大小 end %寻找error数组中第一列大于0的最小值所在的第二列的值即为半径 a=min(error(error(:,1)>0,1)); r=error(error(:,1)==a,2);
结果:
分度圆半径为229.8
打印误差(齿厚和与齿隙和之差的绝对值)随假设半径的变化
符合认知,可知计算无误。
总结:
由照片直接读取是有一个问题的,就是一个像素点对应的实际尺寸大小并不知道,这应该在拍照的时候用其他已知长度的物体用作标定。故而在这次处理中模数并不能求取。而且齿顶圆齿根圆分度圆半径都是以像素点为单位。
- 点赞
- 收藏
- 分享
- 文章举报
- Image2Data (a) 利用Matlab提取图片中的曲线数据
- 【Matlab图像处理】学习笔记:提取图片的R,G,B分量
- matlab从图片提取或拟合直线并画出拟合直线的方法
- matlab/python+opencv提取圆形鱼眼图片的有效区域
- JavaScript 图片自适应 和 get参数提取
- 基于MATLAB和Python实现MFCC特征参数提取
- 【转】使用matlab软件打开一幅图片并且分别提取其中的RGB分量并显示
- matlab usb摄像头---实时视频---等间隔时间提取图片
- MATLAB提取图片点击处的坐标代码(仅供参考)
- 利用MATLAB对Rosbag中数据的进行提取(特别是当bag中存在图片信息的时候)
- MATLAB-图片特定颜色区域提取(矩阵)
- 使用matlab软件打开一幅图片并且分别提取其中的RGB分量并显示
- 【Matlab】将avi视频提取出帧序列图片并保存
- 基于MATLAB的电商平台图片中文字的提取与识别(第四届泰迪杯全国数据挖掘竞赛A题)
- Matlab提取MFCC特征参数
- [项目实战派]opencv通过dll调用matlab函数,图片作为参数
- matlab 标定提取棋盘格角点调整参数
- 毕业设计——人脸检测——002 MATLAB实现提取一张图片像素点的RGB值
- matlab提取视频流与图片成视频
- MATLAB提取图片中的曲线数据重新画图