Matlab论坛
直播中

乂统天下

5年用户 232经验值
擅长:可编程逻辑 测量仪表 嵌入式技术 控制/MCU
私信 关注

源码交流=图像处理 实现图像中的螺纹识别[Tested]

本帖最后由 乂统天下 于 2020-4-15 13:57 编辑

新手学习,多多关照,互相交流,共同进步^-^
【实现功能】实现图像中的螺纹识别
找到照片中的螺纹,并绘制出螺纹线、标记出螺纹的波峰与波谷、直线拟合
【处理效果】
NO.1:原图(半边螺纹)
result1=原图(半边螺纹).jpg
NO.2:寻找图像中的螺纹波形
result2=螺纹波形.jpg
NO.3:对图像中的螺纹波形进行尺寸标注
result3=计算结果.jpg

【改进分析】
暂无

【程序展示】
  1. % 功能:matlab图像处理实现螺纹识别
  2. % 说明:无

  3. clear;clc;close all

  4. I=imread('luowen1.bmp');   %读入螺纹图片
  5. try
  6.     I=rgb2gray(I);         %如果是rgb图,则转换成灰度图
  7. catch
  8.    
  9. end

  10. figure
  11. imshow(I)
  12. title('原图(半边螺纹)')
  13. for K=1:15
  14.     I=wiener2(I,[5 5]);   %滤波15次,把多余的点滤去
  15. end
  16. [m,n]=size(I);

  17. I=edge(I,'canny');       %边缘检测,得到螺纹的波形
  18. [m,n]=size(I);           %计算图像的尺寸

  19. I=I(20:m-20,20:n-20);    %把图像的边角去掉,留下有用的部分
  20. [m,n]=size(I);           %计算去掉边角之后的图像尺寸
  21. figure
  22. imshow(I)                %显示去掉边角之后的图像
  23. title('螺纹波形')

  24. %把白色像素点的位置得到(像素为1的点的坐标)
  25. N=1;   %计数器
  26. for i=1:m               
  27.     for j=1:n
  28.         if I(i,j)==1      
  29.             x(N)=i;     %保存白色像素的横坐标x
  30.             y(N)=j;     %保存白色像素的纵坐标y
  31.             N=N+1;      %计数器+1
  32.         end
  33.     end
  34. end

  35. [x,IX]=sort(x);   %将x按升序排列
  36. y=y(IX);          %对应的y顺序依次和x对应
  37. figure
  38. plot(x,y)         %绘制出螺纹线
  39. xlabel('横轴x')   %标注横轴x
  40. ylabel('纵轴y')   %标注纵轴y
  41. title('计算结果')
  42. view([90 90])
  43. hold on
  44. axis equal
  45. axis([1 m 1 n])

  46. M=10;    %设置波峰和波谷的个数
  47. lengthxy=length(x);     %计算x和y数据点个数
  48. dlength=floor(lengthxy/M);  %将x和y等分M段,计算每一段的长度

  49. for K=1:M
  50.     xx{K}=x((K-1)*dlength+1:K*dlength);   %保存每一段x的值
  51.     yy{K}=y((K-1)*dlength+1:K*dlength);   %保存每一段y的值
  52. end

  53. for K=1:M
  54.     [bofengy(K),index1]=max(yy{K});   %寻找每一段y里的最大值
  55.     bofengx(K)=xx{K}(index1);         %得到与波峰对应的横坐标x
  56.     [boguy(K),index2]=min(yy{K});     %寻找每一段y里的最小值
  57.     bogux(K)=xx{K}(index2);           %得到与波谷对应的横坐标x
  58. end
  59. scatter(bofengx,bofengy)              %绘制出波峰的点
  60. scatter(bogux,boguy,'k')              %绘制出波谷的点


  61. %所有的波峰进行直线拟合,计算出直线的斜率k1和截距b1
  62. A1=[bofengx',ones(length(bofengx),1)];  
  63. kb1=A1bofengy';
  64. k1=kb1(1);
  65. b1=kb1(2);
  66. %绘制出波峰拟合得到的直线
  67. x0=[1 m];
  68. Y1=k1*x0+b1;
  69. plot(x0,Y1,'m');

  70. %所有的波谷进行直线拟合,计算出直线的斜率k2和截距b2
  71. A2=[bogux',ones(length(bogux),1)];
  72. kb2=A2boguy';
  73. k2=kb2(1);
  74. b2=kb2(2);
  75. %绘制出波谷拟合得到的直线
  76. x0=[1 m];
  77. Y2=k2*x0+b2;
  78. plot(x0,Y2,'r');


【源码下载】
下载链接:https://www.lanzous.com/iajjk6j
下载密码:efgy                                                         
代码调试不易。转载请标明出处,谢谢!
如果感觉本文对您有帮助,请留下您的赞,您的支持是我坚持写作分享的最大动力,谢谢!  





更多回帖

发帖
×
20
完善资料,
赚取积分