红外弱小目标检测:常见的评价指标

本文总结红外弱小目标检测领域论文中经常出现的算法评价指标,并对部分评价指标用MATLAB实现。

目前总结的评价指标最为常见,像检测率、ROC曲线这些都要基于大量的实验才能得到数据,进而绘制表格或曲线对算法进行客观评价。(所以,有好的idea,一定要尽快做实验呀!)

本文代码全部原创,若有不足之处,欢迎指正。


常见的评价指标(evaluation metrics)

一、检测率P_d与虚警率F_a

检测率P_d与虚警率F_a的定义如图1.

                                                                                 图1 检测率P_d与虚警率F_a,摘自[1]

关于检测率P_d的理解:

  1. 单帧图像中,拍摄到M个目标,正确检测出N个目标,则P_d=\frac{N}{M};
  2. 图像序列中,拍摄到多个目标或目标出现多次,假设目标共出现M次,目标被正确检测出N次,则P_d=\frac{N}{M}

关于虚警率F_a的理解:

  1. 单帧图像中,若所有目标被正确检出,则虚警率为0;
  2. 图像序列中,图像共N帧,检测出的误检的数量为F,则F_a=\frac{F}{N}。 

怎样的检测结果才可以被看作是“true detection“?

必须同时满足两个条件:

  1. 检测结果与图像中的真实目标有重叠(have overlap pixels);
  2. 检测结果的中心像素位置与真实目标的中心像素位置相差不超过一定的范围,文献[1]中阈值为4 pixels。

二、信噪比(Signal-to-Clutter Ratio,  SCR)

2.1 SCR定义

SCR=\frac{ |\mu_t-\mu_b|}{ \sigma_b}  ……………… 公式(1)

式中,\mu_t表示目标的像素平均值,\mu_b, \quad \sigma_b分别表示目标周围背景的像素平均值和像素标准差。

                                                                图2 目标及其邻域示意图,摘自[1],其中d的大小不超过20个像素

2.2 MATLAB 计算SCR

2.2.1 绘制弱小目标的三维灰度图

在阅读文献时,经常可以看到目标的三维灰度图,作者通过展示目标增强前与增强后,或背景抑制前和抑制后的三维灰度图来直观地向读者呈现其算法的效果。

此外绘制目标的三维灰度图也可以直观的感受目标的SCR。所以,我们先来学习如何绘制目标的三维灰度图。

补充说明,绘制目标的三维灰度图有两种选择:

(1)有些文章会选择绘制整张图的三维灰度图,然后用箭头—>标示出目标的“峰值”;

(2)也可以选择绘制目标的局部区域,观察目标的局部对比度是否得到了增强。

这里给出分别给出两种方式的MATLAB代码与图例。

%% 绘制图像的三维灰度图
img1 = imread('images/1.jpg');
if (size(img1,3) > 1)
    img1 = rgb2gray(img1);
end
subplot(221)
imshow(img1);title('原图');
sub_img1 = img1(68:88,99:119);   % 这里需要人工选择目标区域位置及大小
subplot(222)
imshow(sub_img1);title('目标局部图像 20*20');

subplot(223)
[y,x] = size(img1);
[X,Y] = meshgrid(1:x, 1:y);
surf(X, Y, img1);title('全局三维灰度图');
shading interp;

subplot(224)
[sub_y, sub_x] = size(sub_img1);
[sub_X, sub_Y] = meshgrid(1:sub_x, 1:sub_y);
surf(sub_X, sub_Y, sub_img1);title('局部三维灰度图');
shading interp;

                                                                         图3 含弱小目标的红外图像的全局三维灰度图与局部三维灰度图

2.2.2 求目标的SCR

  1. 本文给出的代码只适用于灰度图;
  2. 参考计算模型如图2.
function scr = CalculateSCR(img, pos, t_size, d)
%% 功能说明:计算弱小目标的SCR
%% 参数说明: img -- 原图像
%            pos -- 目标在原图像中的位置
%            t_size = [a,b]-- 目标尺寸
%            d -- 目标邻域半径,最终计算的目标及其局部区域的大小为(2d+a)*(2d+b)
   
    % 1. 转灰度图
    if(size(img,3)>1)
        img = rgb2gray(img);
    end
    
    % 2. 目标大小为a*b
    a = t_size(1);
    b = t_size(2);
    T = img(ceil(pos(1)-b/2):ceil(pos(1)+b/2), ceil(pos(2)-a/2):ceil(pos(2)+a/2));
    
    % 3. 目标与其周围邻域,大小为(a+2d)*(b+2d) 
    B = img(ceil(pos(1)-b/2-d):ceil(pos(1)+b/2+d), ceil(pos(2)-a/2-d):ceil(pos(2)+a/2+d));
    B(d:d+b,d:d+a) = 0;
    
    % 4. 分别显示目标图与背景图
    figure
    imshow(T);title('Target');
    figure
    imshow(B);title('Background');
    
    % 5. 分别计算目标的灰度均值、背景的灰度均值与标准差
    T_avg = mean(T(:));
    B_avg = sum(B(:)) / ((a+2*d)*(b+2*d) - a*b);
    size(B)
    B_1 = B(1:d,:);
    B_2 = B(a+d+1:a+2*d,:);
    B_3 = B(d+1:d+a, 1:d);
    B_4 = B(d+1:d+a, d+b+1: 2*d+b);
    
    B_final = [B_1(:)',B_2(:)',B_3(:)',B_4(:)'];
    size(B_final);
    B_std = std(double(B_final));
    
    % 6. 计算SCR
    scr = abs(T_avg - B_avg)/B_std;
end

                                                                图4 原图、目标图与局部背景图,

                              这里原图大小为(150,200),手动选择的目标位置为pos=(80,108),目标尺寸为t_size=(4,4),d = 10.

三、平均信噪比(Average SCR, \overline{SCR})

当(1)一张图中含有多个目标;(2)图像序列中含有多个目标时,目标的平均信杂比来评估多目标检测的难度与算法的性能。

平均信杂比的定义为:      \overline{SCR} = \frac{1}{N} \sum^{N}_{i=1}{ SCR_i}   ……………………公式(2)

式中,N表示目标的数量;SCR_i表示第i个目标的信杂比。

文献[1]中,还使用\overline{SCR_d},\quad\overline{SCR_l} 分别表示被检测的真实目标与未被检测出的真实目标的平均信杂比。通常,在检测虚警率确定的情况下,\overline{SCR_d},\quad\overline{SCR_l}越小,算法的检测性能越好。

四、ROC曲线

弱小目标检测中的ROC曲线与机器学习中的ROC曲线定义略微不同。

弱小目标检测中的ROC曲线,以虚警率(false-rate, FA)为横轴,以检测率(Probability of detection, PD)为纵轴(FA,PD的定义见第一部分)。

通常,虚警率相同的情况下,检测率越高,则算法的性能越好。

                                                                                               图5 不同算法的ROC曲线对比,摘自[1]

绘制ROC曲线并不难,难点在于需要通过实验获取数据——不同算法的在相同虚警率下的检测率。

这里给出MATLAB绘制折线图的简单示例,包含一些小技巧:设置x, y轴的间隔;设置线宽与线的样式;设置x, y坐标轴描述

x = 0:0.5:15;

%% 这里需要替换为实验结果
Pd_1 = 1 - exp(-x) ;
Pd_2 = 1 - exp(-1/2*x);

% 设置显示样式与线宽LineWidth
plot(x, Pd_1, '-ob', 'LineWidth', 2);
hold on
plot(x, Pd_2, '-*r', 'LineWidth', 1);

% 设置坐标轴范围
axis([0,15,0,1]);
% 设置坐标轴范围及间隔
set(gca, 'XTick', [0:5:15]);
set(gca, 'YTick', [0:0.1:1]);

% 显示图例
legend('method_1', 'method_2');

% 显示坐标轴描述与标题
xlabel('False-rate, F_a');
ylabel('Probability of detection, P_d');
title('不同算法的ROC曲线');

                                                                                                      图6 ROC示例图

参考文献

[1]   C. Gao et al., “Infrared Patch-Image Model for Small Target Detection in a Single Image,” vol. 22, no. 12, pp. 4996–5009, 2013.

目标检测是计算机视觉领域中的一个重要任务,它旨在从图像或视频中自动检测出目标物体的位置、大小,并进行分类或识别。以下是对目标检测及计算机视觉的详细解析: 一、目标检测的基本概念 定义:目标检测的任务是找出图像中所有感兴趣的目标(物体),确定它们的类别和位置。这包括解决“是什么?”(分类问题)和“在哪里?”(定位问题)两个核心问题。 基本框架:目标检测的基本框架通常包括目标定位、目标分类和目标框回归三个部分。目标定位负责在图像中精确定位目标的位置和大小;目标分类则是将该目标与预先定义的种类进行匹配;目标框回归则是根据预测的位置偏移量修正目标框的位置和大小,以提高检测精度。 二、目标检测的分类 目标检测算法大致可以分为以下几类: 基于传统机器学习目标检测算法:这类算法主要通过手动提取图像的特征,如颜色、形状、边缘等,然后使用传统的机器学习方法,如支持向量机(SVM)、决策树等进行分类。然而,这类算法需要人工设计特征提取器,且难以适应不同形态的物体检测,因此逐渐被深度学习方法所取代。 基于深度学习的目标检测算法:随着深度学习技术的发展,基于神经网络目标检测算法逐渐成为主流。这类算法可以自动学习图像的特征,无需人工干预,大大提高了检测的准确率和效率。深度学习目标检测算法主要分为两类:Two-stage和One-stage。 Two-stage算法:先进行区域生成,再通过卷积神经网络进行样本分类。常见的Two-stage算法有R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:直接在网络中提取特征来预测物体分类和位置,无需区域生成步骤。常见的One-stage算法有YOLO(You Only Look Once)、SSD(Single Shot MultiBox Detector)等。 三、目标检测在计算机视觉中的应用 目标检测在计算机视觉领域有着广泛的应用,包括但不限于以下几个方面: 智能交通:在交通监控系统中,目标检测可用于车辆、行人等目标的检测,帮助交通系统更好地进行交通管理和安全控制。此外,在自动驾驶领域,目标检测也是实现自主驾驶的关键技术之一。 安防监控:在安防领域,目标检测可用于人脸识别、行为分析等方面,提高安防监控的效率和精准度。例如,通过对监控视频中的行人、车辆等进行目标检测,可以实现对安防事件的及时预警处理。 医学影像分析:在医学影像分析领域,目标检测可用于识别CT、MRI等影像数据中的病变区域,辅助医生进行疾病的诊断和治疗。 农业自动化:在农业领域,目标检测可用于果
### 使用Python绘制红外图像的三维可视化 为了实现红外图像的三维可视化,在Python中通常会利用`matplotlib`库中的`mpl_toolkits.mplot3d`模块以及NumPy来进行操作。下面是一个具体的例子,假设已经有一个表示温度分布的二维数组作为输入。 ```python import numpy as np from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt # 假设infrared_data是从文件或其他方式获取到的红外热成像数据矩阵 infrared_data = np.random.rand(100, 100) * 50 + 273.15 # 随机生成模拟的数据集,范围设定在绝对温标下 fig = plt.figure() ax = fig.add_subplot(111, projection='3d') X = np.arange(0, infrared_data.shape[1], 1) Y = np.arange(0, infrared_data.shape[0], 1) X, Y = np.meshgrid(X, Y) surf = ax.plot_surface(X, Y, infrared_data, cmap='hot', linewidth=0, antialiased=False) plt.colorbar(surf, shrink=0.5, aspect=5) # 添加颜色条说明温度变化 plt.title('3D Visualization of Infrared Image') plt.xlabel('Pixel X Position') plt.ylabel('Pixel Y Position') plt.show() ``` 这段代码创建了一个基于随机数生成的假定红外图像,并将其转化为三维表面图显示出来。实际应用时应替换`infrared_data`变量的内容为真实的测量值或读取自特定设备/传感器的实际红外图像数据[^1]。 对于MATLAB而言,同样可以通过内置函数轻松完成这项工作: ```matlab % 加载红外图像数据至workspace环境内,这里用magic函数制造一个测试样本代替真实加载过程 infraredData = magic(100); figure; surfc(infraredData); title('3D Surface Plot with Contour'); xlabel('Column Index'); ylabel('Row Index'); zlabel('Temperature Value'); colorbar; % 显示色彩条辅助解释高度对应的颜色意义 colormap hot; % 设置绘图使用的配色方案 shading interp; % 平滑着色效果 view(-38, 36); % 调整视角角度获得更好的观察体验 ``` 上述两段脚本分别展示了如何使用两种不同工具来构建红外图像的三维视图。值得注意的是,具体细节可能会依据所处理的具体情况和个人偏好有所不同,比如调整坐标轴标签、改变图形外观样式等。
评论 39
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值