本文是基于给定的两张多线激光图片,如下图所示。需将图片中的激光线的中心线坐标提取出来并绘制激光中心线图形。因为是Matlab课程训练研究大作业,所以全文代码为Matlab,希望可以为相似作业的非专业同学提供一些帮助。

文章目录

1.问题分析

2.研究思路及关键代码

2.1图片一部分

2.1.1二值化处理

2.1.2 重心法提取中心线

2.1.3 图像叠加

2.2 图像二部分

2.2.1 分区二值化处理

2.2.2 光斑处理

2.2.3 提取中心线

3.总结及整体代码

3.1 总结

3.2 整体代码

3.2.1 图片一

3.2.2 图片二

3.3 参考链接


1.问题分析

由于是给定图片,数量不是很多,因此可以对每个图像单独分析,这也是本篇文章的局限性。在拿到图像时,如果懂ps的,可以先调大整体图像的亮度,可以看到一些原本图像显示并不清楚的地方,例如在图二中,原图中右下部分是没有激光线的,但是在调亮后确有,这是在交大作业的前一天晚上发现的,因此大家都没有再改的了。

第一张图中,其线条相对简单,激光线基本垂直于水平线,没有较大的噪点,因此可以先二值化处理图形,再利用重心法提取中心线,可以实现像素级提取激光中心线。

第二张图中,可以发现激光线有较大的倾斜角,且亮度不一,并有较大的光斑对图像造成干扰,因此提取较第一张图更加复杂一些。可以先对图像进行区域二值化处理,再去除光斑的影响,最后提取激光条纹中心线。

2.研究思路及关键代码

2.1图片一部分

2.1.1二值化处理

遍历图一每个像素点,经过多次调试后设定二值化的阈值为60,当图片的灰度值小于60是置为0,否则置为255,得到处理后的图。

for i=1:afor j=1:bif I(i,j)<60I(i,j)=0;elseI(i,j)=255;endend
end

2.1.2 重心法提取中心线

从图中任取出一条水平线,读取其处理后的灰度值如下图。

可以发现,每个峰值区即为激光线,因此提取每段峰值区的中点即可提取其中心线,再遍历每条水平线即可。

    w=1; %字母含义为某排识别出的中心点横坐标的序号for i=1:afor j=1:bif I(i,j)==255 %识别出某条激光线的第一个位置坐标k=j;while I(i,k)==255 %判断该条激光线的最后一个位置坐标k=k+1;if k>=b;break;endends(w)=ceil((k-1+j)/2); %通过首尾位置计算中心点坐标存入数组中w=w+1;endI(i,j)=0; %抹除图像所有亮点endI(i,s)=255; %赋给中心点255w=1;s=0;end

2.1.3 图像叠加

再与原图叠加即可验证其提取效果。由于需要用彩色图来区分,因此需把灰度图转化成RGB图像,灰度图是一个0-255的数来显示的,而RGB图是(R,G,B)三个0-255的数来描述,因此涉及到图像的转化部分。代码和最终图像如下。

for i=1:a for j=1:bq=I0(i,j); %读取原图II(i,j,1)=q;II(i,j,2)=q;II(i,j,3)=q;if I(i,j)==255 %读取提取中心线的图II(i,j-2,1)=255; %中心线显示为红色II(i,j-2,2)=0;II(i,j-2,3)=0;endend
end

2.2 图像二部分

2.2.1 分区二值化处理

可以明显观察到左上角的条纹的亮度较小,且有斜向右下的亮宽条纹对激光条纹有较大的影响。因此,对图像进行分区二值化以得到更好的预处理效果。

利用四条直线将上图分成5个部分。

对于1号和3号部分,其激光条纹亮度差异不大,因此可以设置较大的阈值,设定像素的灰度值小于160时置为0,否则置为255。

对于2号和5号部分,其中激光条纹亮度差异较大,应设置较小的阈值。设定像素的灰度值小于45时置为0,否则置为255。

对于4号部分,由于其干扰线亮度大,激光条纹线亮度也大,因此设定阈值应更大以滤去干扰线部分。设定像素的灰度值小于230时置为0,否则置为255。

处理后的图如下。

2.2.2 光斑处理

对图像进行膨胀腐蚀处理,可以提取图中的圆。

se=strel('disk',8); %设置圆半径
fc=imerode(I,se);   %图像腐蚀
fc=imdilate(fc,se);   %图像膨胀

将上图反值后,与原图像叠加,得到去除圆的图像,再经过降噪处理,得到待提取中心线的图像

I=bwareaopen(I,10); %降噪处理

将之前提取到的圆的图像与上图进行相交判断处理,识别圆是否与直线相交。首先使用canny算子提取圆的边缘,再判断每个边缘像素点周围5个点的位置是否于待提取直线相交。在找到相交边缘后,再把对应圆找到。以每个圆内点为圆心,50为半径,判断其是否与边缘点相交,得到相交边缘所在圆。最后再将其与待提取中心线的图像部分叠加,得到最后的待提取中心线部分

fc1=edge(fc,'canny'); %用Canny算子进行边缘检测for i=1:a %检测边缘是否与直线相交for j=1:b-5if fc1(i,j)==1s=0;for m=1:5if I(i-m,j-m)==1||I(i+m,j-m)==1||I(i-m,j+m)==1||I(i+m,j+m)==1s=1;endendif s==0fc1(i,j)=0;endendend
endfor i=1:a %找到相交边缘圆for j=1:bif fc(i,j)==255s=0;radius=50;for m=max(1,i-radius):min(a,i+radius)for n=max(1,j-radius):min(b,j+radius)if ((m-i)^2+(n-j)^2<=radius^2)&&(fc1(m,n)==1)s=1;break;endendendif s==0fc(i,j)=0;endendend
endfor i=1:a %合并相交圆与待提取中心线for j=1:bif fc(i,j)==255I(i,j)=255;endend
end

2.2.3 提取中心线

采用bwmorph函数,提取激光条纹的骨架线作为其中心线。

I = bwmorph(I,'thin',100);

再将其与原图叠加,得到最终图。

3.总结及整体代码

3.1 总结

在对图片一进行处理时,二分阈值的选取可能不适用于部分区域,导致提取出来的中心线有部分偏移。当然也可以不预先进行二值化,从而采用基于灰度的重心法,对于噪声小的图像可能适用,但是噪声过大就会提取出噪声了。

在对第二张图片处理时,和第一张图相比,最大的不同便是整个图像倾斜、激光线明暗变化较大,且有明显的噪点,给二值化处理带来困难,分区二值化相当于是一个妥协,也是不能通用的阻碍。在查找资料时,其实还有更专业的处理方法,opencv已提供有现成可用的api,但是本文要求为Matlab代码,因此仅仅为同为需求的同学提供一些帮助,也不失为应付作业的一种方法罢。

3.2 整体代码

3.2.1 图片一

clc ; clear all;
I = imread('图片一.bmp');
[a,b]=size(I);
figure(1);
imshow(I);
title('原图');
I0=I;%保存一份原图,用于后面叠加显示%******二值化图像**********
for i=1:afor j=1:bif I(i,j)<60I(i,j)=0;elseI(i,j)=255;endend
end
figure(2);
imshow(I);
title('二值化的图');
imwrite(I,'二值化的图.tif');%******重心法提取中心线**********
q=100;
while q>0w=1;for i=1:afor j=1:bif I(i,j)==255k=j;while I(i,k)==255k=k+1;if k>=b;break;endends(w)=ceil((k-1+j)/2);w=w+1;endI(i,j)=0;endI(i,s)=255;w=1;s=0;endq=q-1;
endfor i=1:a %中心线与原图叠加for j=1:bq=I0(i,j);II(i,j,1)=q;II(i,j,2)=q;II(i,j,3)=q;if I(i,j)==255II(i,j-2,1)=255;II(i,j-2,2)=0;II(i,j-2,3)=0;endend
endfigure(3);
imshow(II);
title('最终图1');
imwrite(II,'最终图1.tif');

3.2.2 图片二

clc ; clear all;
I = imread('图片二.bmp');
[a,b]=size(I);
figure(1);
imshow(I);
title('原图');
pif=I;%******分区二值化图像**********
for i=1:afor j=1:bif(((i/320+j/128)>1)&&((i/800+j/400<1))||((i/1900+j/1100>1)))%四条直线分区if I(i,j)<45I(i,j)=0;elseI(i,j)=255;endelse if ((i/800+j/400>1))&&((i/1900+j/1100<1)&&(3*i-5*j>200))if I(i,j)<230I(i,j)=0;elseI(i,j)=255;endelseif I(i,j)<160 %设置不同的阈值过滤图像I(i,j)=0;elseI(i,j)=255;endendendend
endfigure(2);
imshow(I);
title('二值化的图');
imwrite(I,'二值化的图.bmp');%******处理图中的圆形噪点**********
se=strel('disk',8);
fc=imerode(I,se);   %图像腐蚀
fc=imdilate(fc,se);   %图像膨胀
figure(3);
imshow(fc);
title('原图处理后的圆点图');
imwrite(fc,'原图处理后的圆点图.bmp');for i=1:afor j=1:bif fc(i,j)==255I(i,j)=0; %将白色圆形置为黑色endend
endfigure(4);
imshow(I);
title('去除圆形的图');
imwrite(I,'去除圆形的图.bmp');%******去除图像中的剩余噪点**********
I=bwareaopen(I,10);
figure(5);
imshow(I);
title('去噪图');
imwrite(I,'去噪图.bmp');%******检测与直线相交的圆边缘**********
fc1=edge(fc,'canny'); %用Canny算子进行边缘检测
figure(6);
imshow(fc1);
title('圆边缘图');
imwrite(fc1,'圆边缘图.bmp');%检测边缘是否与直线相交
for i=1:afor j=1:b-5if fc1(i,j)==1s=0;for m=1:5if I(i-m,j-m)==1||I(i+m,j-m)==1||I(i-m,j+m)==1||I(i+m,j+m)==1s=1;endendif s==0fc1(i,j)=0;endendend
end
figure(7);
imshow(fc1);
title('相交圆边缘');
imwrite(fc1,'相交圆边缘图.bmp');%******找到相交边缘圆**********
for i=1:afor j=1:bif fc(i,j)==255s=0;radius=50;for m=max(1,i-radius):min(a,i+radius)for n=max(1,j-radius):min(b,j+radius)if ((m-i)^2+(n-j)^2<=radius^2)&&(fc1(m,n)==1)s=1;break;endendendif s==0fc(i,j)=0;endendend
endfigure(8);
imshow(fc);
title('相交圆');
imwrite(fc,'相交圆图.bmp');%******合并相交圆与线**********
for i=1:afor j=1:bif fc(i,j)==255I(i,j)=255;endend
end
figure(9);
imshow(I);
title('需要找中心线的部分');
imwrite(I,'需要找中心线的部分.bmp');%******提取中心线**********
I = bwmorph(I,'thin',100);%生成的I为逻辑数
figure(10);
imshow(I);
title('提取的中心线');
imwrite(I,'提取的中心线.bmp');%******合并中心线与原图,中心线置红**********
for i=1:afor j=1:bq=pif(i,j);pifs(i,j,1)=q;pifs(i,j,2)=q;pifs(i,j,3)=q;if  I(i,j)==1pifs(i,j,1)=255;pifs(i,j,2)=0;pifs(i,j,3)=0;endend
endfigure(11);
imshow(pifs);
title('最终图');
imwrite(pifs,'最终图.bmp');

3.3 参考链接

激光光条中心的提取_九磅十五便士_的博客-CSDN博客_光条中心提取

基于Matlab的多线激光中心坐标值提取相关推荐

  1. 基于Matlab在以地球为中心的场景中模拟和跟踪航路飞机仿真(附源码)

    目录 一.创建航路空中交通方案 二.定义飞机模型和轨迹 三.沿路线添加监控站 四.可视化场景 五.定义中央雷达跟踪器和跟踪热熔器 六.使用雷达和 ADS-B 跟踪飞行 七.分析结果 八.总结 九.程序 ...

  2. 基于matlab的对称振子天线分析,基于Matlab的对称振子天线分析

    天线方面文献 第27卷第2期 2009年3月泉州师范学院学报(自然科学)JournalofQuanzhouNormalUniversity(NaturalScience)Vol.27No.2Mar.2 ...

  3. 对称振子天线matlab程序,基于MATLAB研究对称振子天线的报告

    内容介绍 原文档由会员 霜天盈月 发布 基于MATLAB研究对称振子天线的报告 本文共计32页,13162字: 摘要 基于MATLAB研究了对称振子阻抗特性和图形仿真,同时针对对称振子阻抗特性给出了仿 ...

  4. 对称振子天线的matlab仿真,基于Matlab的对称振子天线分析

    曾 永 西 (泉州师范学院理工学院,福建泉州 362000) 摘 要:对称振子天线是应用最广泛的线天线,分析与设计对称振子天线的难点之一是其复杂的数值计算 与方向图的可视化输出.文章利用Matlab ...

  5. 基于MATLAB的车道线识别、自动驾驶识别

    使用单目相机的视觉感知 这个例子展示了如何构建一个能够进行车道边界和车辆检测的单眼摄像机传感器仿真.该传感器将在车辆坐标系中报告这些检测结果.在本例中,您将了解自动驾驶工具箱™使用的坐标系统,以及设计 ...

  6. matlab 光平面标定代码,线结构光视觉传感器/线激光深度传感器标定工具(matlab)...

    线结构光视觉传感器/线激光深度传感器标定工具(matlab) 发布时间:2018-03-13 17:32, 浏览次数:655 , 标签: matlab 线结构光视觉系统有着结构简单.使用灵活.受周围光 ...

  7. 基于视觉的车道线识别技术在智能车导航中的应用研究

    密级:公开 摘  要 摘  要 室外移动机器人的研究是机器人研究领域的重要分支,同时也是备受关注的热点领域.面向高速公路等结构化道路的室外移动机器人研究已成为现阶段民用交通运输领域移动机器人研究的主流 ...

  8. 线结构光视觉传感器/线激光深度传感器标定工具

    续集:线结构光视觉传感器/线激光深度传感器标定工具(续) https://jah10527.github.io/articles/lineLaser.html 线结构光视觉系统有着结构简单.使用灵活. ...

  9. 【必备知识】:线激光条纹中心线提取算法导读

    线激光条纹特性 线激光器是由点激光器和前置透镜组成的.点激光器可以为He-Ne激光器或半导体激光器.相比较He-Ne激光器,半导体激光器因其输出光源具有发散性,更适合用于制作线激光器.需要说明的是,半 ...

最新文章

  1. springMVC 使用WebApplicationContext获取ApplicationContext对象
  2. 【iOS开发必收藏】详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!...
  3. Windows 8 应用开发 - 应用栏
  4. Win7下快速预览各种类型的文本文件
  5. halcon学习笔记——机器视觉工程应用的开发思路
  6. C语言文件操作(二)对指定txt文件中的N个数排序
  7. 【linux命令总结】——后续用到的内容持续补充和更新
  8. mongotemplate中save抛出异常_异常处理的三个好习惯 | Python 工匠
  9. 解决win10安卓虚拟机每十几分钟蓝屏重启问题
  10. php 点击下拉显示内容,php+ajax实现仿百度查询下拉内容功能示例
  11. python制作动图、怎么运行_漫画:如何分析运行中的 Python 程序?
  12. 加来道雄 基因编辑 纳米机器人_同样基因编辑技术,为什么2位学者获得诺奖,中国贺建奎被痛骂?!...
  13. 腾达无线路由器怎么建立服务器,腾达无线路由器网关和域名服务器
  14. coldfusion_ColdFusion 9有什么新功能?
  15. The Curious Case of Neural Text Degeneration
  16. servlet3 文件上传
  17. IPv6和IPv4的区别
  18. (三)棋盘覆盖问题(思路)
  19. 虾皮直播怎么开启店铺引流-扬帆际海
  20. 如何通过低代码开发平台实现CRM客户关系管理系统

热门文章

  1. Oracle数据库监听启动报错
  2. Content-Type一览 1
  3. co-training方法
  4. Microbiome:环境过滤驱动农田生态系统土壤古菌独特的空间分布(一作解读)
  5. IOS小组件(4-2):创建可配置小组件(动态修改配置数据)
  6. NDK Build 用法(NDK Build)
  7. 《DIY智慧小屋—带你玩转物联网》简述LoRa和NB-IoT的技术特点,他们有哪些共同点和差异点,在生活中LoRa和NB-IoT各有哪些适合的应用场景?
  8. 清华发长文回应校园疫情防控工作,提前开通学生返乡专线
  9. 读书笔记:《冯唐成事心法》
  10. 北京西客站火车行李托运指南