红外小目标检测

目录

  • 背景
  • 概述
  • 算法原理
      • 演示效果
      • 核心逻辑
    • 使用方式
      • 基础镜像
      • 配置环境
      • 直接运行
    • 参考文献


  • 文章声明,非广告,仅个人体验。

背景

  • 红外图像在许多领域中都有所应用。例如军事领域中,经常需要通过红外成像设备对远距离的目标进行侦察和监视,如复杂背景下的无人机、导弹之类的物体。此外,航空航天领域中也需要通过红外传感器检测地面或海上的船只、车辆等等。这些需要检测的物体在红外图像中通常都是以不超过7X7像素大小的小目标呈现。在实际应用时,我们一般不需要区分这些物体的形状或纹理,而只需区分图像中是否有这些物体(有时对其检测位置及大小也有一定要求)以及时采取相应的措施,这就是红外小目标检测的应用场景。 在真实的应用场景中,这样的单帧红外图像短时间内就可能产生相当大的数量,如果人为一张张查看会耗费相当大的人力,所以一个能够自动检测出红外小目标的算法就显得相当有意义。

  • 不同于自然图像,红外图像中的物体因为拍摄距离较远通常以小目标呈现,加之受各种因素的干扰,如环境因素(无人机可能受到雾或是云层的干扰)与设备自身因素(传感器不可避免地引入噪声)等,使得红外小目标淹没在各种复杂的背景中,检测具有相当的难度。本文复现的方法就是致力于实现高效的红外小目标检测。

  • 参考文献:https://www.aspiringcode.com/content?id=17194033422039&uid=e0d52bade2d0497f9cf268db47231b67

概述

本文用python复现论文Infrared Small Target Detection Based on Facet Kernel and Random Walker中提出的红外小目标检测算法。原文连接https://ieeexplore.ieee.org/abstract/document/8705367

该论文提出了一种针对红外图像中小目标检测的算法。在红外小目标检测方面优于其之前的所有传统方法并且为后续传统的红外小目标检测算法打下了良好的基础。

该方法作为非深度学习方法,基于滤波与图论的思想来对红外小目标进行检测。所以其对算力几乎没有任何要求,且性能也足够优秀。其提出的检测与分割的策略与指标为后续许多相关论文所借鉴。

从展示结果可以看出,该算法可以将红外图像中位于云层背景干扰下的微小目标精确地检测并分割出来,这是其他传统方法难以实现的。

算法原理

检测流程中图像的变化
在这里插入图片描述

  • 1.均值滤波与次序统计滤波2 × 2的均值滤波用于平滑图像来降低噪声等级,为后续RandomWalker算法的使用创造一个低噪声空间,此外次序统计滤波被使用来去除一部分图像中的单点高亮噪声。假设原图像为I,此步骤之后的图像被称为增强图像M对应流程中的(b)。

在这里插入图片描述
在这里插入图片描述
u为MF​ 的均值,σ为其标准差,本次实现中参考官方论文的默认值设为4。
分割后的图像对应流程中的(d)。可以看到,这样的粗检无法避免云层中背景杂波的干扰。

  • 3.RandomWalker算法分割
    对于(d)图中的候选目标像素,依次设置为一个11 ×× 11邻域的中心,在对应原图的这个11 ×× 11的邻域内,中心像素设为目标,周围一圈设为背景,如下图所示:

在这里插入图片描述
目标种类标为1,背景标为2。RndomWalker算法会根据未标记像素与标记像素的灰度相似程度来自动对未标记像素进行分割。利用RandomWlaker算法进行分割并得到邻域内所有像素属于目标类的概率值,大于等于0.5的设为目标类,小于0.5的设为背景类。
至此,检测本可以结束。但本文提出了两个特异性指标来进一步优化检测与分割结果。即:

在这里插入图片描述
公式的意思是如果邻域内中心像素不在分割的目标区域内部即将此指标设为0,否则就设为一个概率值。这个概率值是这样获得的,将邻域内非中心像素而被分割为目标像素的那些像素所属目标类的概率值取平均作为分子,被分为背景像素的那些像素所属目标类的概率值取平均作为分母。这个指标在目标区域明显会大于背景区域。,具体来说它用于区分以下情况:
在这里插入图片描述
(a1)是真正的目标区域,而(a2)是背景区域,但由于中心较亮,其也存在被分为目标区域的像素。此指标的值在(a1)会远大于(a2)从而区分这两种情况,找出真正的目标区域。
在这里插入图片描述
这个公式的意思是,如果邻域中被分为背景区域的像素的灰度值的最大值大于等于被分为目标区域像素的平均灰度值,就将该指标设为0,否则就设为目标区域灰度值的平均值除以背景区域灰度的最大值。这个指标用于进一步去除单点高亮噪声被错误分为目标区域的情况。具体来说,单点高亮噪声所处的邻域中,这个值的计算应当为0.最终将两个指标相乘,即
在这里插入图片描述

演示效果

在这里插入图片描述

核心逻辑

def visual_attention_rw(img,k):#FacetKernel滤波img = img.astype(np.float64) / 255.0# Step 2: Define the filterh = np.array([[1, 1, 1], [1, 0, 1], [1, 1, 1]])# Step 3: Apply the rank filterimg_1 = rank_filter(img, rank=7, footprint=h)# Step 4: Calculate the ratiocon_idx = img / img_1# Step 5: Create a masktmp = np.ones_like(img)tmp[con_idx > 1] = 0# Step 6: Combine the imagesimg = img * tmp + img_1 * (1 - tmp)h = np.ones((2, 2)) / 4img_filtered= convolve(img, h, mode='nearest')img=img_filteredim = img.copy()L = np.array([[-4, -1, 0, -1, -4],[-1, 2, 3, 2, -1],[0, 3, 4, 3, 0],[-1, 2, 3, 2, -1],[-4, -1, 0, -1, -4]])im_mirrored = mirror_matrix(im, 3)img_dog = convolve2d(im_mirrored, L, mode='valid')#探测Th = np.mean(img_dog) + k * np.sqrt(np.var(img_dog))# 创建与 img_dog 相同大小的全 1 数组img_idx = np.ones_like(img_dog)# 将 img_dog 中小于阈值 Th 的位置设为 0img_idx[img_dog < Th] = 0# 创建 out1 并将 img_dog 中小于阈值 Th 的部分设为 0out1 = img_dog.copy()out1[img_dog < Th] = 0# 对 out1 进行归一化,防止除以零out1 = out1 / (np.max(out1) + 1e-6)patch=11p=(patch+1)//2im_m=mirror_matrix(im,p)im_out = np.zeros_like(im_m)out2 = im_out.copy()out3 = im_out.copy()p_idx_r, p_idx_c = np.where(img_idx == 1)im_v = im[img_idx == 1]I = np.argsort(-im_v)p_idx_r = p_idx_r[I]p_idx_c = p_idx_c[I]FLAG = np.zeros_like(im_out)patch_half = (patch - 1) // 2for i in range(len(p_idx_r)):r_pos = int(p_idx_r[i] + (patch - 1) //2)c_pos = int(p_idx_c[i] + (patch - 1) // 2)if FLAG[r_pos, c_pos] == 1:continue# 提取图像块img = im_m[r_pos - patch_half: r_pos + patch_half + 1,c_pos - patch_half: c_pos + patch_half + 1]X, Y = img.shape# 计算 s1x 和 s1ys1x = int((patch + 1) / 2)-1s1y = int((patch + 1) / 2)-1# 复制 img 并设置边界img_2 = img.copy()img_2[:, 0] = 1img_2[:, -1] = 1img_2[0, :] = 1img_2[-1, :] = 1idx = np.flatnonzero(img_2 == 1)# 将 idx 转换为 double 类型(与 MATLAB 类型相似)idx = idx.astype(float)markers= np.zeros_like(img)markers[:, 0] = 2markers[:, -1] = 2markers[0, :] = 2markers[-1, :] = 2markers[s1x,s1y]=1mask=random_walker(img, markers,mode='bf',beta=200)proba = random_walker(img, markers,mode='bf', return_full_prob=True,beta=200)prob_t=proba[0,:,:]if np.sum(mask == 1) == 1:# 将 im_out 数组在位置 (r_pos, c_pos) 处的值设为 0im_out[r_pos, c_pos] = 0# 将 FLAG 数组在位置 (r_pos, c_pos) 处的值设为 1FLAG[r_pos, c_pos] = 1# 跳过当前循环的剩余部分,继续下一次循环continuemask[s1x, s1y] = 2# 计算 prob_t 数组中对应 mask 中等于 1 的位置的均值prob_res = np.mean(prob_t[mask == 1])# 计算 prob_t 数组中对应 mask 中不等于 1 的位置的均值# 并将 prob_res 除以这个均值prob_res = prob_res / np.mean(prob_t[mask != 1])# 将 mask 数组在位置 (s1x, s1y) 处的值重新设为 1mask[s1x, s1y] = 1inten_res=local(mask,img)idx_r, idx_c = np.where(mask == 1)patch_half = (patch - 1) // 2for j in range(len(idx_r)):r_idx = r_pos - patch_half + idx_r[j] - 1c_idx = c_pos - patch_half + idx_c[j] - 1if FLAG[r_idx, c_idx] == 1:continueim_out[r_idx, c_idx] = prob_res * inten_res ** 6out2[r_idx, c_idx] = prob_resout3[r_idx, c_idx] = inten_res ** 6FLAG[r_idx, c_idx] = 1out2 = out2[patch_half:-patch_half, patch_half:-patch_half]out3 = out3[patch_half:-patch_half, patch_half:-patch_half]out2 = out2 / (np.max(out2) + 1e-6)out3 = out3 / (np.max(out3) + 1e-6)im_out = im_out[patch_half:-patch_half, patch_half:-patch_half]im_out = im_out * img_dogim_out = im_out / (np.max(im_out) + 1e-6)out4 = im_outreturn out4

使用方式

基础镜像

python:3.9.19

配置环境

解压后进入InfraredTargetDetection项目路径下
运行以下命令:

pip install -r requirements.txt

直接运行

python main.py

即可看到视频中示例图片的小目标检测效果。

更换图片运行或调整参数运行
修改main.py文件里的默认图片路径
在这里插入图片描述
将"data/rice.png"更改为你自己的图片路径即可。
调整参数,只需要去调整k=4即可,k越大该算法对目标的判定越严格。

参考文献

  • 参考文献:https://www.aspiringcode.com/content?id=17194033422039&uid=e0d52bade2d0497f9cf268db47231b67

  • [1] Qin Y, Bruzzone L, Gao C, et al. Infrared small target detection based on facet kernel and random walker[J]. IEEE Transactions on Geoscience and Remote Sensing, 2019, 57(9): 7104-7118.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/479070.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【滑动窗口】找到字符串中所有字母异位词

文章目录 找到字符串中所有字母异位词 class Solution { public:vector<int> findAnagrams(string s, string p) {vector<int> ret;int sLen s.size(), pLen p.size(), validChar;// 母串长度比子串长度还小 直接返回空vectorif (sLen < pLen)return ret;// …

nodepad配置c/c++ cmd快速打开创建项目文件

前提:下载MinGw,并且配置环境变量 点击阅读次篇文章配置MinGw 无论是哪个编译器&#xff0c;执行c文件都是经历以下步骤: 编译文件生成exe文件执行该exe文件 我们先手动完成这两部 手动编译文件使用指令 gcc {你的c文件} -o {生成文件名}生成exe文件 第二步运行exe直接点击该文…

Opencv+ROS实现颜色识别应用

目录 一、工具 二、原理 概念 本质 三、实践 添加发布话题 主要代码 四、成果 五、总结 一、工具 opencvros ubuntu18.04 摄像头 二、原理 概念 彩色图像&#xff1a;RGB&#xff08;红&#xff0c;绿&#xff0c;蓝&#xff09; HSV图像&#xff1a;H&#xff0…

Vue.Draggable使用nested-with-vmodel进行拖拽

Vue.Draggable使用nested-with-vmodel进行拖拽 1. 介绍 ‌draggable‌是一个基于Sortable.js的Vue组件&#xff0c;用于实现拖拽功能。它支持触摸设备、拖拽和选择文本、智能滚动、不同列表之间的拖拽等功能&#xff0c;并且与Vue的视图模型同步刷新&#xff0c;兼容Vue2的过…

【湿度数据处理】中国地面气候资料日值数据集(V3.0)(MATLAB全代码)

【湿度数据处理】中国地面气候资料日值数据集 处理1:数据范围筛选处理2:缺测数据筛查处理3:缺测数据插补参考基于此博客完成各要素数据提取后-【数据集处理】中国地面气候资料日值数据集(V3.0)(含MATLAB全代码),进行后续数据筛选及缺测处理,此处以湿度数据为例。 提取到的…

vulnhub靶场之corrosion靶场1

corrosion靶场1 前言 靶机&#xff1a;corrosion靶场1 攻击&#xff1a;kali 主机发现 使用arp-scan -l发现主机IP&#xff0c;这里直接查看虚拟机需要登录&#xff0c;不过官方并没有提供密码&#xff0c;所以&#xff0c;扫描出IP地址 信息收集 使用nmap查看端口及服务…

代码随想录算法训练营day46|动态规划09

买卖股票的最佳时机四 之前是最多只能完成两笔交易&#xff0c;现在是至多可以买卖k次&#xff0c;那么状态数需要定为2*k1种&#xff0c;此时&#xff0c;就要分析多种情况的递推式 找到奇偶数交替的规则即可 class Solution { public:int maxProfit(int k, vector<int&g…

前端-Git

一.基本概念 Git版本控制系统时一个分布式系统&#xff0c;是用来保存工程源代码历史状态的命令行工具 简单来说Git的作用就是版本管理工具。 Git的应用场景&#xff1a;多人开发管理代码&#xff1b;异地开发&#xff0c;版本管理&#xff0c;版本回滚。 Git 的三个区域&a…

【软件介绍】变声工具RVC本地部署使用方法

RVC&#xff08;Real-Time Voice Conversion&#xff09;软件是一种能够实现实时声音转换的技术工具&#xff0c;它允许用户改变自己或他人的语音特征&#xff0c;比如音调、音色等&#xff0c;以达到变声的效果。这种技术在娱乐、游戏、内容创作等领域有着广泛的应用。下面是一…

IntelliJ IDEA 中,自动导包功能

在 IntelliJ IDEA 中&#xff0c;自动导包功能可以极大地提高开发效率&#xff0c;减少手动导入包所带来的繁琐和错误。以下是如何在 IntelliJ IDEA 中设置和使用自动导包功能的详细步骤&#xff1a; 一、设置自动导包 打开 IntelliJ IDEA&#xff1a; 启动 IntelliJ IDEA 并打…

【CANOE】【Capl】【RS232】控制串口设备

系列文章目录 内置函数&#xff0c;来控制传统的串口设备&#xff0c;比如继电器等 文章目录 系列文章目录前言一、控制串口二、自定义相关的参数RS232Configure**函数语法****函数功能****参数说明****返回值****示例代码** 三、回调函数的使用RS232OnSend**函数语法****函数…

AX58100+STM32使用FSMC接口,运行EtherCAT Slave协议栈

目录 简介环境硬件接线MCU一侧的初始化时钟FSMC外部中断timer 协议栈生成EtherCAT SlaveSlave infomationgenerichardwareEtherCAT State MachineSynchronisationApplicaitonProcessDataMailbox OD TOOL 协议栈移植协议栈集成和错误初步解决启动协议栈 应用开发集成到TWINCAT集…

IC数字后端实现之大厂IC笔试真题(经典时序计算和时序分析题)

今天小编给大家分享下每年IC秋招春招必考题目——静态时序分析时序分析题。 数字IC后端笔试面试题库 | 经典时序Timing计算题 时序分析题1&#xff1a; 给定如下图所示的timing report&#xff0c;请回答一下几个问题。 1&#xff09;这是一条setup还是hold的timing report?…

嵌入式系统与OpenCV

目录 一、OpenCV 简介 二、嵌入式 OpenCV 的安装方法 1. Ubuntu 系统下的安装 2. 嵌入式 ARM 系统中的安装 3. Windows10 和树莓派系统下的安装 三、嵌入式 OpenCV 的性能优化 1. 介绍嵌入式平台上对 OpenCV 进行优化的必要性。 2. 利用嵌入式开发工具&#xff0c;如优…

英伟达发布 Edify 3D 生成模型,可以在两分钟内生成详细的、可用于生产的 3D 资源、生成有组织的 UV 贴图、4K 纹理和 PBR 材质。

英伟达发布 Edify 3D 生成模型&#xff0c;可以利用 Agents 自动判断提示词场景中需要的模型&#xff0c;生成后将他们组合为一个场景。 Edify 3D 可以在两分钟内生成详细的、可用于生产的 3D 资源、生成有组织的 UV 贴图、4K 纹理和 PBR 材质。 相关链接 论文&#xff1a;htt…

抖音短视频矩阵源代码部署搭建流程

抖音短视频矩阵源代码部署搭建流程 1. 硬件准备 需确保具备一台性能足够的服务器或云主机。这些硬件设施应当拥有充足的计算和存储能力&#xff0c;以便支持抖音短视频矩阵系统的稳定运行。 2. 操作系统安装 在选定的服务器或云主机上安装适合的操作系统是关键步骤之一。推…

【Android+多线程】异步 多线程 知识总结:基础概念 / 多种方式 / 实现方法 / 源码分析

1 基本概念 1.1 线程 定义&#xff1a;一个基本的CPU执行单元 & 程序执行流的最小单元 比进程更小的可独立运行的基本单位&#xff0c;可理解为&#xff1a;轻量级进程组成&#xff1a;线程ID 程序计数器 寄存器集合 堆栈注&#xff1a;线程自己不拥有系统资源&#…

NLP论文速读(剑桥大学出品)|分解和利用专家模型中的偏好进行改进视觉模型的可信度

论文速读|Decompose and Leverage Preferences from Expert Models for Improving Trustworthiness of MLLMs 论文信息&#xff1a; 简介&#xff1a; 本文探讨的背景是多模态大型语言模型&#xff08;MLLMs&#xff09;&#xff0c;这类模型通过结合视觉特征和文本空间来增强语…

CentOS8.5.2111(7)完整的Apache综合实验

一、实验目标 1.掌握Linux系统中Apache服务器的安装与配置&#xff1b; 2.掌握个人主页、虚拟目录、基于用户和主机的访问控制及虚拟主机的实现方法。 二、实验要求 练习使用linux系统下WEB服务器的配置方法。 三、实验背景 重庆工程学院为筹备“重庆工程大学”特申请了c…

零基础3分钟快速掌握 ——Linux【终端操作】及【常用指令】Ubuntu

1.为啥使用Linux做嵌入式开发 能广泛支持硬件 内核比较高效稳定 原码开放、软件丰富 能够完善网络通信与文件管理机制 优秀的开发工具 2.什么是Ubuntu 是一个以桌面应用为主的Linux的操作系统&#xff0c; 内核是Linux操作系统&#xff0c; 具有Ubuntu特色的可视…