激光中心线算法MATLAB仿真

激光线投射到物体上,会被物体的轮廓调制,即,激光线图像会携带物体的轮廓信息,但是激光器的工作特点使其投射的激光线有一定宽度,不符合图像处理的要求,图像中的光条纹通常具有一定的宽度,能否准确地提取光条纹中心是测量线结构光的关键步骤之一。

常见的光线中心线提取法:极值法,阈值法,灰度重心法,梯度重心法,曲线拟合法,Hessian算法等,光条提取速度与提取精度,很难同时兼顾二者。

激光线图像特点:

1.光束与被测物体相交,在被测物体表面产生光条。

2.易受影响产生畸变,不连续光条。                          

3.这种程度包含了物体表面的深度信息。

极值法:利用光带中心点位于光带横截面灰度的极大值处这一特性,找到光强的极大值即获得光带中心。

阈值法是在结构光光条特性以及被测物体表面特性相同的情况下,阈值分割处理后,将光条横截面中灰度值大于预设门限的左右两像素为起点和终点,二者的平均位置即光条中心。

灰度重心法利用数学上质心的定义,将灰度值作为质量处理,计算沿坐标轴方向的灰度重心点来代表该截面的激光条纹的中心点位置,按照行或者列遍历图像,拟合得到的点作为激光条纹的中心线。其公式为:

激光中心线算法MATLAB仿真_第1张图片

看了某位大神的OpenCV的代码,然后尝试转换成了MATLAB的代码。

MATLAB代码:


clear;clc;close all;

%% 输入图像
I=imread('laser.png'); 
I=double(rgb2gray(I)); %%%转换成灰度图
I=I(3:end-2,3:end-2);  %%%原图边界处全是白的,要去掉,否则影响效果,其他图可能不需要
figure
imshow(I,[])
title('原始图像')       %%%显示原图


%% 极值法:首先将图像转化为灰度图,然后按行寻找每一列的亮度最大值, 在这里还加入了一个阈值threshod,也可以不加
tic 
th=120;                %%%设定阈值
I1=zeros(size(I,1),size(I,2));
    for j=1:size(I,2)  %%%遍历图像的每一列,找出每一列强度最大值所在的行,当该位置的强度大于阈值时,认为这一列的激光所在位置即为该行
        t=find (I(:,j)==max(I(:,j)));
        t1(j)=round(mean(t));
      if I(t1(j),j)>th
        I1(t1(j),j)=255;
        end
    end
figure
imshow(I1,[])       
title('极值法')
clear t1 t
 toc

tic 
%% 阈值法:从图像的左右两侧向中间寻找激光条的左右边界,然后找到左右边界的中点即为激光线的中心

th=120; %%% 阈值
I2=zeros(size(I,1),size(I,2)); 
    for j=1:size(I,2)  %%%遍历图像的每一列,找出每一列像素强度>阈值的所有行,取这些行数的平均值即认为该平均值所在的行为激光线
        t=find (I(:,j)>th); 
        t1(j)=round(mean(t));
        if isnan (t1(j))~=1   %%%排除一些不存在满足条件的列 比如某一列没有强度大于阈值的点
        I2(t1(j),j)=255;
        end
    end
figure
imshow(I2,[])
title('阈值法')
clear t1 t
toc

tic 
%% 灰度质心法:将图像转为灰度图并二值化,把灰度值看作质量,每一行的重心作为激光线的中心

th=120;
I3=zeros(size(I,1),size(I,2));
Ib=I;
for j=1:size(I,2)   %%%图像二值化,认为大于阈值的像素为1,小于的是0
    for i=1:size(I,1)
        if Ib(i,j)>th
            Ib(i,j)=1;
        else
            Ib(i,j)=0;
        end
    end
end
l=1:size(I,1);
for j=1:size(I,2)  %%%遍历图像的每一列
    t=Ib(:,j).*l'; %%%计算每一行的加权和,即sum(行数*对应的强度)
    t1(j)=round(sum(t)/sum(Ib(:,j))); %%%加权平均,即用加权和除以像素的强度和,确定重心位置   
    if isnan (t1(j))~=1  %%%排除一些不存在满足条件的列 比如某一列没有强度大于阈值的点
        p=0;
        if I(t1(j),j)>th
            I3(t1(j),j)=255;
        end
    end
end
figure
imshow(I3,[])
title('灰度质心法')
clear t1 t

toc







你可能感兴趣的:(MATLAB,算法,matlab,图像处理)