Extraction of light bar centerline Steger algorithm [Matlab]

Steger algorithm is based on Hessian matrix, which can realize the center of light stripe Sub-pixel Precision positioning:

Firstly, the normal direction of light stripe can be obtained by Hessian matrix, and then the sub-pixel position can be obtained by Taylor expansion in the normal direction.

 

function theta=steger(EinRDR)
%Stripe center
 im=double(EinRDR);
im = im/max(im(:)); 
%imshow(im)
bw=im2bw(im);
[x0,y0]=find(bw==1);
sigma=1;
% seek hessian matrix
[Dx,Dy,Dxx,Dxy,Dyy] = Hessian2D(im,sigma);
 
[eigenvalue1, eigenvalue2, eigenvectorx, eigenvectory]=eig2image(Dxx, Dxy, Dyy);  
  
% 
t = -(Dx.*eigenvectorx + Dy .* eigenvectory) ./...  
    (Dxx .* eigenvectorx.^2 + 2*Dxy.*eigenvectorx.*eigenvectory + Dyy.*eigenvectory.^2 );  
  
px = t.*eigenvectorx;  
py = t.*eigenvectory;  
  
[candidateX1, candidateY1] = find(px >= -0.5 & px <= 0.5 & py >= -0.5 & py <= 0.5 & bw==1);  
  
linePixel = [candidateX1, candidateY1];


for i=1:size(candidateX1,1)
    m1=candidateX1(i,1);
    n1=candidateY1(i,1);
    px1(i,1)=px(m1,n1);
    py1(i,1)=py(m1,n1);
    x1(i,1)=m1+px(m1,n1);
    x2(i,1)=py(m1,n1)+n1;
end

p=fitPolynomialRANSAC([x2,x1],1,0.5);

if isempty(p)
    
   xfc=cov(x2,x1);
   [v,d]=eig(xfc);
   [u,q]=find(d==max(d(:)));
   theta=atan(v(2,u)/v(1,u))*180/pi;
   
else
    theta=atan(p(1))*180/pi;
end
if theta<0
    theta=180+theta;
end
%w1=theta1-InRandomdegs8
% p2=polyfit(y0,x0,1);
% theta2=atan(p2(1))*180/pi;
% w2=theta2-InRandomdegs8
  
% figure(1), imshow(im);  
% hold on  
% plot(linePixel(:,2), linePixel(:,1), 'g.');  
% hold off;  
function [Dx,Dy,Dxx,Dxy,Dyy] = Hessian2D(I,Sigma)
%  This function Hessian2 Filters the image with 2nd derivatives of a 
%  Gaussian with parameter Sigma.
% 
% [Dxx,Dxy,Dyy] = Hessian2(I,Sigma);
% 
% inputs,
%   I : The image, class preferable double or single
%   Sigma : The sigma of the gaussian kernel used
%
% outputs,
%   Dxx, Dxy, Dyy: The 2nd derivatives
%
% example,
%   I = im2double(imread('moon.tif'));
%   [Dxx,Dxy,Dyy] = Hessian2(I,2);
%   figure, imshow(Dxx,[]);
%
% Function is written by D.Kroon University of Twente (June 2009)

if nargin < 2, Sigma = 1; end

% Make kernel coordinates
[X,Y]   = ndgrid(-round(3*Sigma):round(3*Sigma));

% Build the gaussian 2nd derivatives filters
DGaussx  = 1/(2*pi*Sigma^4)*(-X).* exp(-(X.^2 + Y.^2)/(2*Sigma^2));
DGaussy  = 1/(2*pi*Sigma^4)*(-Y).* exp(-(X.^2 + Y.^2)/(2*Sigma^2));
DGaussxx = 1/(2*pi*Sigma^4) * (X.^2/Sigma^2 - 1) .* exp(-(X.^2 + Y.^2)/(2*Sigma^2));
DGaussxy = 1/(2*pi*Sigma^6) * (X .* Y)           .* exp(-(X.^2 + Y.^2)/(2*Sigma^2));
DGaussyy = DGaussxx';

Dx  = imfilter(I,DGaussx,'conv');
Dy  = imfilter(I,DGaussy,'conv');
Dxx = imfilter(I,DGaussxx,'conv');
Dxy = imfilter(I,DGaussxy,'conv');
Dyy = imfilter(I,DGaussyy,'conv');
function [Lambda1,Lambda2,Ix,Iy]=eig2image(Dxx,Dxy,Dyy)
% This function eig2image calculates the eigen values from the
% hessian matrix, sorted by abs value. And gives the direction
% of the ridge (eigenvector smallest eigenvalue) .
% 
% [Lambda1,Lambda2,Ix,Iy]=eig2image(Dxx,Dxy,Dyy)
%

%
% | Dxx  Dxy |
% |          |
% | Dxy  Dyy |


% Compute the eigenvectors of J, v1 and v2
tmp = sqrt((Dxx - Dyy).^2 + 4*Dxy.^2);
v2x = 2*Dxy; v2y = Dyy - Dxx + tmp;

% Normalize
mag = sqrt(v2x.^2 + v2y.^2); i = (mag ~= 0);
v2x(i) = v2x(i)./mag(i);
v2y(i) = v2y(i)./mag(i);

% The eigenvectors are orthogonal
v1x = -v2y; 
v1y = v2x;

% Compute the eigenvalues
mu1 = 0.5*(Dxx + Dyy + tmp);
mu2 = 0.5*(Dxx + Dyy - tmp);

% Sort eigen values by absolute value abs(Lambda1)<abs(Lambda2)
check=abs(mu1)>abs(mu2);

Lambda1=mu1; Lambda1(check)=mu2(check);
Lambda2=mu2; Lambda2(check)=mu1(check);

Ix=v1x; Ix(check)=v2x(check);
Iy=v1y; Iy(check)=v2y(check);

From:  steger - qq_41244435

 

steger algorithm line center extraction follow-up work

After steger algorithm extracts the center of the line, it connects the line and makes it work smoothly. What is the edge connection algorithm?

 

 

 

Posted on Mon, 02 Dec 2019 17:12:34 -0500 by satant