Featured image of post 基于 Matlab 的冰下光源检测

基于 Matlab 的冰下光源检测

嗨嗨嗨,又是一次年更成就。本文其实是我的一门 matlab 选修课的大作业,出成绩后直接转过来当博客发 ::aru:diving::


问题重述

“冰耗子"冰底航行器,是一款能够依靠刺轮驱动并实现冰底爬行的冰下探测航行器,不同于 ROV、AUV 等依靠水下推进器进行三维冰下运动的航行器。“冰耗子"利用其正浮力依附冰面下表面,具有自持能力强、续航能力强等特点,适合对冰底单一目标进行长时间探测监控。

然而,由于冰面及水面对 GPS 信号的阻隔,全球定位系统 (GPS) 无法在水下运行[1],冰下的定位问题一直是相关领域的研究重点,尤其是在冰底航行器的回收过程要求航行器精准定位冰洞的具体位置,并靠近冰洞以便科研人员或无人机对其进行回收。

利用冰下光环境较为单一的特点,在实验中,我们使用黄光灯作为信号光源,利用航行器的前端广角摄像头实时拍摄的图像进行光源检测并以此确定冰洞方向。在光源检测过程中,传统的利用深度学习的目标检测手段在较小的样本量下无法充分学习光源特征。因此项目最初使用 Python 基于 OpenCV 框架进行针对光源颜色进行光源的方向检测,然而在 OpenCV 过滤颜色方面有着较不完善、直观等问题,本作业使用 Matlab 基于Color Thresholder 工具包以及其他形态学处理模块对光源检测程序进行了重写。

实拍图像,由航行器摄于码头浮筒下

数学建模

图像色彩过滤

末期光源引导采用 20w 黄光光源作为回收位置标注光源,原因是经过实验[2],黄光能够在环境水域中的衰减距离更小,并且环境水域中的图像噪声更小。视觉识别采用 75°广角摄像头作为光源识别的传感器,能够获得更大的回收位置识别范围,有效避免由于转向过冲导致的 航行器无法识别目标。

由冰耗子前部摄像头拍摄的图像是数字图像,即根据每个像素包含的(R、G、B)三个颜色通道范围对该像素点颜色进行定义。其中 R、G、B 的范围是 0~255,因此能够定义 $256 \times 256\times256=16777216$ 种颜色,这几乎包含了人类视觉所能感知的所有颜色。我们的需求就是通过前部摄像头拍摄的图像寻找出黄光标记点的位置,因此,我们需要给出目标光源的颜色范围,并过滤出除目标光源外的其他干扰颜色信息。然而,虽然 RGB 值提供了一种定义颜色信息的简单方法,但当环境中的亮度发生变化时,R、G、B 的变化是非线性,并且三种颜色分量的取值与所生成的颜色联系并不直观。这导致在处理图像时搜索特定值可能会变得困难. 因此对于数字图像处理,通常将 RGB 图像转换为 HSV。图像像素的定义由 RGB 色彩空间转换为 HSV(色相、饱和度、明度)色彩空间这样 HSV 颜色格式可以直观处理由环境光照变化产生的影响,并便于设定目标光源的色彩变化范围。 航行器设定的搜索光谱范围是:$\begin{bmatrix}30, 100, 167\end{bmatrix} to \begin{bmatrix}70, 193, 255\end{bmatrix}$,经实验这个搜索范围能够较好的水下感知 4m 以内的黄光光源。

图像二值化

完成色彩过滤后,所得到的图像信息依旧是彩色的,需要将彩色图像灰度化并二值化转换为黑白图像。图像二值化处理是指将图像上的每个像素点根据阈值分割设定合适的阈值,将低于该阈值的像素点全部设为黑,将高于该阈值的像素点全部设为白。这个操作可以滤除一部分的干扰噪声,并能够清晰化、明确化目标光源的光斑图像,也能够大幅度减小后期图像处理数据、便于后续的程序处理。二值化的图像的转换方式主要体现在对每个像素色彩值进行套入到映射函数进行计算,采用大津阈值处理法(OSTU)以此得到二值化后的该像素点色彩值,函数可以表示为: $$ Binary(x,y)= \begin{cases} maxvalue, &\text if\ src(x,y)>thresh\ 0, &\text otherwise \end{cases} $$

膨胀操作

由于 航行器摄像头使用自动曝光,航行器与黄光光源距离小于 1m 时,前部广角摄像头获取的图像光源斑点呈现中心明度更高,周围明度更低的特点,当 航行器接近目标光源的过程中,图像色彩过滤会将光斑中心滤除,并且会与光源产生断点,运用形态学处理算法,可进一步提高图像质量,利用膨胀操作可以修正光斑图像中可能存在的断点,利于光源目标识别算法的光源识别操作。

$$ \begin{bmatrix} \cdots & f(x,y-1)=255 & \cdots \ f(x-1,y) & f(x,y)=255 & f(x+1,y) \ \cdots & f(x,y+1) & \cdots \end{bmatrix} $$

光源目标识别

经过以上图像处理后的图像中包含有目标点和噪声点,其中,噪声点主要来源于冰面或水面对光源的镜面反射,经过实验图像的分析,这类镜面反射造成的噪声点与目标点呈垂直分布,水平间距较小,对光源引导的干扰较小,因此在光源目标识别中不考虑目标点和噪声点的区别,并通过增加阈值保证 航行器 在进行光源引导过程中的运动稳定性。

程序介绍

彩色图像阈值选取

在作业中,使用 Matlab 中的 Color Thresholder 工具包进行图像阈值选取,Matlab 的可视化颜色选取并能自动生成阈值过滤函数,工作流程较为便捷。

图像色彩空间选取

在颜色空间中使用 HSV 颜色空间进行处理以便直观处理由环境光照变化产生的影响

图像阈值选取

在阈值选择界面,使用矩形框选工具进行图像阈值的选取,以此在颜色方面筛选出最可能是黄光源目标的位置,并以此对返回图像进行膨胀、边界寻找等形态学操作,并以此获数值上获得目标在二维上的具体像素位置,为航行器提供参考方向。

部分 Matlab 程序

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
raw_image = imread("raw.png");
% imshow(raw_image);

% 调用函数寻找特定
mask = createMask(raw_image);
%imshow(mask);

% 消除噪声
mask = bwareaopen(mask,30);

% 膨胀操作,圆滑边缘
se = strel('line',11,90);
mask=imdilate(mask, se);
imshow(mask)

% 进行填充
fill = imfill(mask, 'holes');
imshow(fill);

% 边界寻找
[B,L] = bwboundaries(fill);

imshow(label2rgb(L,@jet,[.5 .5 .5]))
hold on
for k = 1:length(B)
  boundary = B{k};
  plot(boundary(:,2),boundary(:,1),'w','LineWidth',2)
end

bound = B{1,1};
[r,c] = size(bound);    % 读取行r、列c

x_list = bound(:,1);
y_list = bound(:,2);

% 数值化具体位置
[buttom, top] = max(x_list);
[right, left] = max(y_list);

结果展示

经过形态学处理后,Matlab 将显示识别后的图像并将其绘制,与此同时将边界的二维坐标存入变量,便于后期使用。

image-20230328204949339

image-20230328205013605

参考文献

[1] X. Cui, Q. Zeng, C. Liang and J. Jiao, “Quantitative analysis of the water vaopr effects on the interferometric measurements,” 2016 IEEE International Geoscience and Remote Sensing Symposium (IGARSS), 2016, pp. 6851-6854, doi: 10.1109/IGARSS.2016.7730788.

[2]Xin, Gaifang, Jun Zhu, Chengming Luo, Jing Tang, Zhijian Pei 和 Erhua Wang. 《Mobile Light Spots Detection and Tracking of Vehicle Target in Dim Light Environment》. 收入 2020 8th International Conference on Orange Technology (ICOT), 1–5, 2020. https://doi.org/10.1109/ICOT51877.2020.9468738.