天天看點

matlab從圖檔提取或拟合直線并畫出拟合直線的方法

假如現在有如下一張灰階圖(圖檔名為001.jpg),現在要拟合圖中的那條白線

matlab從圖檔提取或拟合直線并畫出拟合直線的方法

代碼如下(Matlab2017):

im=imread('001.jpg');   %讀取圖檔

%im=rgb2gray(im);   %如果是rgb圖檔則轉為灰階圖

[h,w]=size(im);         %擷取圖檔高(h)、寬(w)

%掃描每一個像素,并記錄白點(值為1)坐标及個數
n=0;
for y0=1:1:h
    for x0=1:1:w
        if(im(y0,x0)==255)
            n=n+1;
            y(n)=y0;
            x(n)=x0;
        end   
    end  
end

%最小二乘法拟合直線
A = 0.0;
B = 0.0;
C = 0.0;
D = 0.0;
for i=1:1:n
    A=A+x(i)*x(i);
    B=B+x(i);
    C=C+x(i)*y(i);
    D=D+y(i);
end

a = (C*n - B*D) / (A*n - B*B);
b = (A*D - C*B) / (A*n - B*B);

%灰階圖轉rgb彩色圖檔
imrgb=repmat(im,[1,1,3]);

%畫線,線寬3,紅色
for i=1:1:w    
    y=a*i+b;
    y2=int32(y);        %把y轉換成整數
    %把線上的通道1(紅色)置為255
    imrgb(y2-1,i,1)=255;
    imrgb(y2,i,1)=255;
    imrgb(y2+1,i,1)=255;
    
    %把線上的其他通道(綠色和藍色)置為0
    imrgb(y2-1,i,2)=0;
    imrgb(y2,i,2)=0;
    imrgb(y2+1,i,2)=0;
    imrgb(y2-1,i,3)=0;
    imrgb(y2,i,3)=0;
    imrgb(y2+1,i,3)=0;
end

%顯示圖檔
imshow(imrgb);
           

運作結果如下:

matlab從圖檔提取或拟合直線并畫出拟合直線的方法