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:ncenterx1=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:ncenterx2=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:mgearline(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)-1num(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:mif gearline(i,3)<(minn+10)boo=1;endif (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)>iintersection1(cc)=j;cc=cc+1;endif gearline(j,3)>i  && gearline(j+1,3)<iintersection2(dd)=j+1;dd=dd+1;endendchixi=0;%对齿厚,齿间隙赋初始值chihou=0;ee=ee+1;for j=1:26chixi=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);            enderror(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

打印误差(齿厚和与齿隙和之差的绝对值)随假设半径的变化

符合认知,可知计算无误。

总结:

由照片直接读取是有一个问题的,就是一个像素点对应的实际尺寸大小并不知道,这应该在拍照的时候用其他已知长度的物体用作标定。故而在这次处理中模数并不能求取。而且齿顶圆齿根圆分度圆半径都是以像素点为单位。

源代码链接

源代码

matlab下对齿轮图片的参数提取相关推荐

  1. MATLAB下批量修改图片名称

    写个简单版的(竟然没有matlab语言的选择项): clc;clear;file_path1 = 'D:\Documents\MATLAB\毕业设计图\第四章\old\';% 图像文件夹路径 file ...

  2. matlab 手掌轮廓,CG_图片轮廓mask提取-matlab

    % Windows function convert_data() source_root_dir = 'E:/data/'; %cname = '000003_1.jpg'; target_root ...

  3. opencv通过dll调用matlab函数,图片作为参数

    [blog 项目实战派]opencv通过dll调用matlab函数,图片作为参数                   前文介绍了如何"csharp通过dll调用opencv函数,图片作为参数 ...

  4. matlab 图片RGB颜色提取

    APP designer版本链接:MATLAB App Designer 特别篇:RGB颜色提取器 新版本链接:matlab图片RGB颜色提取第二版 写了一个程序能实现导入图片识别颜色 支持屏幕截图和 ...

  5. 基于matlab的脉搏信号参数提取,基于Matlab的脉搏信号参数提取.pdf

    基于Matlab的脉搏信号参数提取.pdf 第25卷第1期 2010年2月 山东建筑大学学报Vo1 25 No 1 JOURNAL OF SHANDONG JIANZHU UNIVERSITY Feb ...

  6. matlab 图片RGB颜色提取0-255版

    APP designer版本链接:MATLAB App Designer 特别篇:RGB颜色提取器 新版本链接:matlab图片RGB颜色提取第二版 function getcolor255 glob ...

  7. 机器学习 | MATLAB实现MLP多层感知机newff参数设定(下)

    机器学习 | MATLAB实现MLP多层感知机newff参数设定(下) 目录 机器学习 | MATLAB实现MLP多层感知机newff参数设定(下) 基本介绍 程序设计 参考资料 基本介绍 newff ...

  8. SPAD器件仿真(一)器件参数提取和dark下的I-V曲线仿真

    一.器件参数提取 在之前的器件结构中,在doping中可以设置掺杂的深度,从而知道pn结的大致深度,具体的数值可以通过对器件结构文件进行参数提取,文件必须是进行过初始化的结构文件(.str). 可以提 ...

  9. MATLAB下提高图片亮度

    MATLAB下提高图片亮度 MATLAB下图片亮度补偿:当使用相机或其他设备获取的图片亮度较低,整体偏暗时,可以用一段简单地MATLAB程序进行亮度补偿,后者提升整个照片的亮度. 图1就是光线很弱的条 ...

最新文章

  1. 小P寻宝记——好基友一起走 背包
  2. 全球支付平台paypal社招一面,二面合并面经
  3. 分类模型的评估方法-精确率(Precision)
  4. 中国汽车融资租赁业运营前景与投资战略规划报告2022-2028年版
  5. 本地分发_2020年分发Python应用程序的12个热门途径
  6. PPT设计里的小技巧
  7. 求python一个类与对象的代码_Python基础系列(五)类和对象,让你更懂你的python代码...
  8. 如何实现不同vlan,不同网关的终端间的通信
  9. npm install 的--save-dev和--save(看过不会忘)
  10. linux 下安装安装rzsz命令
  11. c语言标准库详解(五):stdio.h之直接IO/文件定位/错误处理
  12. 记一次golang cpu 占用100%
  13. java操作hfds----刘雯丽
  14. 配置树莓派中文环境 及解决 no write since last change
  15. 大数据面试总结《二十》--优秀简历的编写
  16. IDEA快捷键设置复制上一行
  17. android apk 提取,android APK提取内置软件odex转dex
  18. Ubuntu18.04安装QT5
  19. php笔试面试题大全
  20. 工资软件测试白盒测试报告,软件测试白盒测试实验报告

热门文章

  1. 乐符识别matlab,科学网—[原][Matlab][04] Midi音乐键盘 - 王楠的博文
  2. VLC的windows版本下载
  3. TCP/IP协议中分包与重组原理介绍、分片偏移量的计算方法、IPv4报文格式
  4. 小程序中引导用户关注公众号
  5. 20款对设计师非常有用的在线配色工具
  6. java 读取word 表格,java读取word表格方法
  7. ng alain的简单使用
  8. python柱状图纵轴刻度_Python数据分析:Matplotlib
  9. python安装random_如何安装python randon
  10. 谷歌和IE的兼容问题