weixin_46585498 2020-06-15 22:18 采纳率: 0%
浏览 570

怎样用matlab图像处理技术完美提取细化焊缝中心线,求大神帮忙

图片说明
怎样用matlab图像处理技术完美提取细化焊缝中心线,最好速度快一点

  • 写回答

2条回答 默认 最新

  • 子曰:学不可以已 2020-06-24 17:44
    关注

    可以参照如下代码

    % 功能:matlab图像处理实现直线识别(拟合角平分线)
    % 说明:此程序可直接运行
    % 运行前请确保子程序文件zikuai.m存在
    
    %第1步
    close all
    I=imread('1.jpg'); % 读取图像
    figure
    imshow(I) % 显示原始图像
    I=rgb2gray(I); % 彩色图像转换成灰度图
    
    % I=im2bw(I); % 二值化
    I=edge(double(I)); % 检测图像的边缘
    figure
    imshow(I) % 显示边缘检测的结果
    
    %第2步
    [m,n]=size(I); %计算图像的尺寸
    
    M=3; %定义X方向分割的块数
    N=3; %定义Y方向分割的块数
    mm=floor(m/M); %子块行的长度
    nn=floor(n/N); %子块列的长度
    count=1; %计数器
    figure
    for i=1:M
    for j=1:N
    A=I((i-1)*mm+1:i*mm,(j-1)*nn+1:j*nn); %分割原图像,得到一个子块
    subplot(M,N,count)
    imshow(A) %显示一个子块
    zuoshangjiao=[(i-1)*mm+1 (j-1)*nn+1]; %子块左上角的坐标
    [x,y,k,b]=zikuai(A,zuoshangjiao); %得到子块里白色像素点拟合得到的直线的斜率k和截距b(调用zikuai函数)
    X{count}=x; %保存子块里所有白色像素的x坐标
    Y{count}=y; %保存子块里所有白色像素的y坐标
    K(count)=k; %保存子块里拟合得到的直线的斜率k
    B(count)=b; %保存子块里拟合得到的直线的截距b
    count=count+1; %计数器加1,进行下一个子块的计算
    end
    end
    
    %第3步
    KK=K(~isnan(K)); %去掉K中的NaN(白色像素点少于10的子块)
    BB=B(~isnan(B)); %去掉B中的NaN(白色像素点少于10的子块)
    
    mean_K=mean(KK); %求所有斜率的平均值
    mean_B=mean(BB); %求所有截距的平均值
    
    figure
    subplot(2,1,1)
    plot(KK,'-o')
    title('各子块拟合得到的直线k值')
    subplot(2,1,2)
    plot(BB,'-o')
    title('各子块拟合得到的直线b值')
    
    count1=1;
    count2=1;
    for i=1:length(K)
    IF ~isnan(K(i))
    if K(i)>mean_K %大于斜率平均值的子块,将这些子块的白色像素点位置集合到cell型数组X1和Y1(分别存x和y)
    X1{count1}=X{i};
    Y1{count1}=Y{i};
    count1=count1+1;
    else %小于斜率平均值的子块,将这些子块的白色像素点位置集合到cell型数组X2和Y2(分别存x和y)
    X2{count2}=X{i};
    Y2{count2}=Y{i};
    count2=count2+1;
    end
    end
    end
    
    XX1=[];
    YY1=[];
    XX2=[];
    YY2=[];
    
    for i=1:length(X1) %大于斜率平均值的子块,将这些子块的白色像素点位置集合到double型数组里,方便计算
    XX1=[XX1;X1{i}];
    YY1=[YY1;Y1{i}];
    end
    
    for i=1:length(X2) %小于斜率平均值的子块,将这些子块的白色像素点位置集合到double型数组里,方便计算
    XX2=[XX2;X2{i}];
    YY2=[YY2;Y2{i}];
    end
    
    %%%%%直线1和直线2被从图像里提取出来了分别为XX1,YY1和XX2,YY2
    %离散点拟合得到直线1的斜率k1和截距b1
    A1=[XX1,ones(length(XX1),1)];
    kb1=A1\YY1;
    k1=kb1(1);
    b1=kb1(2);
    
    %离散点拟合得到直线2的斜率k2和截距b2
    A2=[XX2,ones(length(XX2),1)];
    kb2=A2\YY2;
    k2=kb2(1);
    b2=kb2(2);
    
    xx0=[1 m];
    yy0=[1 n];
    
    yy1=k1*xx0+b1; %得到直线1上的两点,以便绘制直线1
    yy2=k2*xx0+b2; %得到直线3上的两点,以便绘制直线2
    
    %%%%绘制拟合得到的直线和分离出来的离散点
    %直线1
    figure
    axis([1,m,1,n]) %设定显示范围
    hold on
    scatter(XX1,YY1,'LineWidth',5) %绘制直线1对应的白色像素位置
    plot(xx0,yy1,'r','LineWidth',3) %绘制拟合到的直线1
    
    %直线2
    hold on
    scatter(XX2,YY2,'k','LineWidth',5) %绘制直线2对应的白色像素位置
    plot(xx0,yy2,'y','LineWidth',3) %绘制拟合到的直线2
    
    
    %第4步
    
    %求两条直线的交点
    X0=(b2-b1)/(k1-k2);
    Y0=k1*X0+b1;
    
    alpha=atan(k1); %直线1与x夹角
    beta=atan(k2); %直线2与x夹角
    
    K01=tan((alpha+beta)/2); %角平分线1的斜率
    K02=tan(-pi/2+(alpha+beta)/2); %角平分线2的斜率
    
    B01=Y0-K01*X0; %角平分线1的截距
    B02=Y0-K02*X0; %角平分线2的截距
    
    %绘制角平分线
    xx0=[1 m];
    yy0=[1 n];
    
    YY1=K01*xx0+B01; %角平分线1
    YY2=K02*xx0+B02; %角平分线2
    plot(xx0,YY1); %绘制角平分线1
    plot(xx0,YY2); %绘制角平分线2
    
    view([90 90])
    

    引用:_http://bbs.elecfans.com/jishu_1913351_1_1.html_

    评论

报告相同问题?

悬赏问题

  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置