6 图像处理实现螺纹识别案例(matlab程序)

news/2024/7/21 4:51:55 标签: matlab, 图像处理, 数学建模, 学习

学习目的:学习识别案例掌握识别方法    

 

2.代码

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=A1\bofengy';
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=A2\boguy';
k2=kb2(1);
b2=kb2(2);
%%   绘制出波谷拟合直线
x0=[1 m];
Y2=k2*x0+b2; 
plot(x0,Y2,'r');

 

3.运行结果

ac81c19128c44c578e557d0d613616ee.png

 d94a2d831fbe4beaa10919fd823e4ed6.png

 2e7a5e8896cb4d41b59e9fa410b5d6eb.png

 

 


http://www.niftyadmin.cn/n/776756.html

相关文章

Windows下使用TortoiseSVN SVN回滚到旧版本

当发现新提交的代码有问题,然后想将某个旧的版本作为最新的版本时,可以使用回滚, 操作步骤如下: 1. 签出(CheckOut)最新版本的代码到电脑中(不能做任何修改) 2. 执行TortoiseSVN的Show log操作, 在新签出的文件夹上…

mysql BLOB字段转String的方法

1、sql语句直接查询转换 select convert(field using utf8) as A from table; 2、java程序转换 String str; try{ strnew String((byte[])entry.getValue,"utf-8"); hashmap.put(entry.getKey().toString(),str); }catch(UnsupportedEncodingException e){ e.pr…

Java日历类(GregorianCalendar和Calendar) 打印当前月份日历

package xxx;import java.text.DateFormatSymbols; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.Locale;/*** 打印当前月份日历*/ public class PrintCalendar {public static void main(String[] args) {// 设置日历的显示的地区Locale…

调用webservice 警告:Unable to find required classes (javax.activation.DataHandler and javax.mail.interne

错误描述:调用webservice时调用端调用时爆出警告 警告: Unable to find required classes (javax.activation.DataHandler and javax.mail.internet.MimeMultipart),是警告不影响使用。 Unable to find required classes (javax.activation.DataHandler…

java.lang.OutOfMemoryError: Java heap space 报错实例

Heap(堆):堆是所有线程都能访问的,随着虚拟机的启动而存在,这块区域很大,因为所有的线程都在这个区域保存实例化的对象,因为每一个类型中,每个接口实现类需要的内存不一样,一个方法内的多个分支…

MySQL恢复数据库 实战 通过复制数据目录文件夹

背景:原来的数据库服务器操作系统坏了,但是能够找到以前MySQL安装路径里面的文件 恢复步骤: 1.在另外服务器上安装相同版本的MySQL数据库 (最好安装过程中的配置都是一样的) 2.停止服务 net stop mysql (或者通过服务界面也可以…

MySQL恢复 利用innodb_force_recovery修复MySQL数据页损坏

现象:启动MySQL服务时报1067错误,服务无法启动。 查看xxx.err错误日志发现有数据页损坏信息: InnoDB: Database page corruption on disk or a failed InnoDB: file read of page 200. 出现上述现象是由于突然断电、强制关机、强制杀死MySQL进…

Oracle转换时间出现的问题:ORA-01810: format code appears twice

Java开发中需要使用oralce中的to_date()函数用于将字符串转换为日期对象,也会出现各种报错: 报错1: ORA-01810: format code appears twice insert into event_vpn (card_id,inevent,inip,outevent,outip,workday,ntid) values (60192,to_d…