本帖最后由 乂统天下 于 2020-4-15 13:57 编辑
新手学习,多多关照,互相交流,共同进步^-^
【实现功能】实现图像中的螺纹识别
找到照片中的螺纹,并绘制出螺纹线、标记出螺纹的波峰与波谷、直线拟合
【处理效果】
NO.1:原图(半边螺纹)
NO.2:寻找图像中的螺纹波形
NO.3:对图像中的螺纹波形进行尺寸标注
【改进分析】
暂无
【程序展示】
- % 功能:matlab图像处理实现螺纹识别
- % 说明:无
- clear;clc;close all
- I=imread('luowen1.bmp'); %读入螺纹图片
- try
- I=rgb2gray(I); %如果是rgb图,则转换成灰度图
- catch
-
- end
- figure
- imshow(I)
- title('原图(半边螺纹)')
- for K=1:15
- I=wiener2(I,[5 5]); %滤波15次,把多余的点滤去
- end
- [m,n]=size(I);
- I=edge(I,'canny'); %边缘检测,得到螺纹的波形
- [m,n]=size(I); %计算图像的尺寸
- I=I(20:m-20,20:n-20); %把图像的边角去掉,留下有用的部分
- [m,n]=size(I); %计算去掉边角之后的图像尺寸
- figure
- imshow(I) %显示去掉边角之后的图像
- title('螺纹波形')
- %把白色像素点的位置得到(像素为1的点的坐标)
- N=1; %计数器
- for i=1:m
- for j=1:n
- if I(i,j)==1
- x(N)=i; %保存白色像素的横坐标x
- y(N)=j; %保存白色像素的纵坐标y
- N=N+1; %计数器+1
- end
- end
- end
- [x,IX]=sort(x); %将x按升序排列
- y=y(IX); %对应的y顺序依次和x对应
- figure
- plot(x,y) %绘制出螺纹线
- xlabel('横轴x') %标注横轴x
- ylabel('纵轴y') %标注纵轴y
- title('计算结果')
- view([90 90])
- hold on
- axis equal
- axis([1 m 1 n])
- M=10; %设置波峰和波谷的个数
- lengthxy=length(x); %计算x和y数据点个数
- dlength=floor(lengthxy/M); %将x和y等分M段,计算每一段的长度
- for K=1:M
- xx{K}=x((K-1)*dlength+1:K*dlength); %保存每一段x的值
- yy{K}=y((K-1)*dlength+1:K*dlength); %保存每一段y的值
- end
- for K=1:M
- [bofengy(K),index1]=max(yy{K}); %寻找每一段y里的最大值
- bofengx(K)=xx{K}(index1); %得到与波峰对应的横坐标x
- [boguy(K),index2]=min(yy{K}); %寻找每一段y里的最小值
- bogux(K)=xx{K}(index2); %得到与波谷对应的横坐标x
- end
- scatter(bofengx,bofengy) %绘制出波峰的点
- scatter(bogux,boguy,'k') %绘制出波谷的点
- %所有的波峰进行直线拟合,计算出直线的斜率k1和截距b1
- A1=[bofengx',ones(length(bofengx),1)];
- kb1=A1bofengy';
- k1=kb1(1);
- b1=kb1(2);
- %绘制出波峰拟合得到的直线
- x0=[1 m];
- Y1=k1*x0+b1;
- plot(x0,Y1,'m');
- %所有的波谷进行直线拟合,计算出直线的斜率k2和截距b2
- A2=[bogux',ones(length(bogux),1)];
- kb2=A2boguy';
- k2=kb2(1);
- b2=kb2(2);
- %绘制出波谷拟合得到的直线
- x0=[1 m];
- Y2=k2*x0+b2;
- plot(x0,Y2,'r');
复制代码
【源码下载】
下载链接:https://www.lanzous.com/iajjk6j
下载密码:efgy
代码调试不易。转载请标明出处,谢谢!
如果感觉本文对您有帮助,请留下您的赞,您的支持是我坚持写作分享的最大动力,谢谢!
0
|
|
|
|