LCM红外小目标检测
根据站内的matlab代码修改成python版本。
import numpy as np
import matplotlib.pyplot as plt
import cv2
from pylab import mpl# 设置中文显示字体
mpl.rcParams["font.sans-serif"] = ["SimHei"]def LCM_computation(patch_LCM_in):row, col = patch_LCM_in.shape # 对patch而言,行=列patch_LCM_in = np.array(patch_LCM_in, dtype=np.double) # 改变数据类型# 分为3x3个cells,无论patch的尺寸,都是3*3个cellcell_size = row // 3# 计算中心cell的最大值 是一个标量L_n = np.max(patch_LCM_in[cell_size + 1:cell_size * 2, cell_size + 1:cell_size * 2]) # 选中patch中心区域,求最大值L_n_2 = L_n ** 2# 计算周边cell的均值,周边共3^2-1个cell,编号如下:# 1 2 3# 4 0 5# 6 7 8m_1 = np.mean(patch_LCM_in[0:cell_size, 0:cell_size])m_2 = np.mean(patch_LCM_in[0:cell_size, cell_size:cell_size * 2])m_3 = np.mean(patch_LCM_in[0:cell_size, cell_size * 2:cell_size * 3])m_4 = np.mean(patch_LCM_in[cell_size:cell_size * 2, 0:cell_size])m_5 = np.mean(patch_LCM_in[cell_size:cell_size * 2, cell_size * 2:cell_size * 3])m_6 = np.mean(patch_LCM_in[cell_size * 2:cell_size * 3, 0:cell_size])m_7 = np.mean(patch_LCM_in[cell_size * 2:cell_size * 3, cell_size:cell_size * 2])m_8 = np.mean(patch_LCM_in[cell_size * 2:cell_size * 3, cell_size * 2:cell_size * 3])# 计算C_nm_cell = np.array([L_n_2 / m_1, L_n_2 / m_2, L_n_2 / m_3, L_n_2 / m_4, L_n_2 / m_5, L_n_2 / m_6, L_n_2 / m_7, L_n_2 / m_8])C_n = np.min(m_cell)# Replace the value of the central pixel with the Cn# patch_LCM_in[cell_size + 1:cell_size * 2, cell_size + 1:cell_size * 2] = C_nreturn C_ndef MLCM_computation(I_MLCM_in):I_MLCM_in = np.array(I_MLCM_in, dtype=np.double)row, col = I_MLCM_in.shapescales = np.array([9, 15, 21, 27]) # patch的尺寸有9x9,15x15,21x21,27x27l_max = scales.shape[0] # 对应论文lmax=[1,4],l_max是4# Compute Cl according to Algorithm 1C_map_scales = np.zeros((row, col, l_max))for i in range(l_max): # 对应不同尺度for j in range(0, row - scales[i] + 1): # 单一尺度下以patch为单位做遍历,j是行for k in range(0, col - scales[i] + 1): # k是列temp_patch = I_MLCM_in[j:j + scales[i], k:k + scales[i]]C_n = LCM_computation(temp_patch) # 对patch执行Algorithm 1C_map_scales[j + scales[i] // 2, k + scales[i] // 2, i] = C_n# 这部分计算,生成4张对比度图,其中尺度最大的对比度图有效像元数最小,每个方向减去(scales(4)-1)/2=13max_margin = (scales[-1] - 1) // 2# 对4种尺度对比图的共同部分取最大值,作为输出C_hat = np.zeros((row - scales[-1] + 1, col - scales[-1] + 1))for i in range(row - scales[-1] + 1):for j in range(col - scales[-1] + 1):temp = np.array([C_map_scales[i + max_margin, j + max_margin, 0],C_map_scales[i + max_margin, j + max_margin, 1],C_map_scales[i + max_margin, j + max_margin, 2],C_map_scales[i + max_margin, j + max_margin, 3]])C_hat[i, j] = np.max(temp)# fig, axs = plt.subplots(2, 2, figsize=(10, 10))# fig.suptitle('Contrast Maps at Different Scales')## X, Y = np.meshgrid(np.arange(1, row + 1), np.arange(1, col + 1))## for i, ax in enumerate(axs.flatten()):# mesh = ax.pcolormesh(X, Y, C_map_scales[:, :, i], shading='auto', cmap='gray')# ax.set_title(f'v={scales[i]}x{scales[i]} Contrast Map')# ax.set_xlabel('row')# ax.set_ylabel('col')# fig.colorbar(mesh, ax=ax)## plt.show()return C_hat, max_margindef target_detection(C_hat, threshold, max_margin, I_in):# 用阈值生成maskrow, col = C_hat.shapemask = np.zeros((row, col), dtype=np.uint8)target_pixel_num = 0 # 统计小目标在mask中占据的像元数for i in range(row):for j in range(col):if C_hat[i, j] > threshold:mask[i, j] = 1target_pixel_num += 1# 再把mask填入原图的中区域,四周各空max_marginrow, col = I_in.shapeI_out = np.zeros((row, col), dtype=np.uint8)I_out[max_margin:row - max_margin, max_margin:col - max_margin] = maskreturn I_out, target_pixel_numdef sqrt_matrix(C_hat, mean_C_hat):C_hat = np.array(C_hat, dtype=np.double)return np.var(C_hat, ddof=1) # 使用ddof=1来得到样本方差if __name__ == "__main__":# 读取测试图像I_read = cv2.imread("./data/40.bmp", cv2.IMREAD_GRAYSCALE)# 图像大小转换为 256*256I_read = cv2.resize(I_read, (256, 256), interpolation=cv2.INTER_NEAREST)# 检测RGB,转为灰度图if len(I_read.shape) == 3: # 如果图像是3通道的,即RGB图像I_in = cv2.cvtColor(I_read, cv2.COLOR_BGR2GRAY)else: # 如果图像已经是单通道的,即灰度图像I_in = I_read# 转为double型I_in = np.double(I_in)# 计算最终的Multiscale LCM[C_hat, max_margin] = MLCM_computation(I_in)# 计算均值、标准差mean_C_hat = np.mean(C_hat)sqrt_C_hat = np.sqrt(sqrt_matrix(C_hat, mean_C_hat))# 计算阈值k_Th = 4threshold = mean_C_hat + k_Th * sqrt_C_hat# 根据阈值判断,输出二值探测结果和统计小目标在mask中占据的像元数[I_out, target_pixel_num] = target_detection(C_hat, threshold, max_margin, I_in)print(target_pixel_num)# 显示输入和输出plt.figure(figsize=(10, 5))plt.subplot(1, 2, 1)plt.imshow(I_in, cmap='gray', vmin=0, vmax=255)plt.title('原图')plt.axis('off')plt.subplot(1, 2, 2)plt.imshow(I_out, cmap='gray', vmin=0, vmax=1)plt.title('二值化输出')plt.axis('off')plt.show()
相关文章:
LCM红外小目标检测
根据站内的matlab代码修改成python版本。 import numpy as np import matplotlib.pyplot as plt import cv2 from pylab import mpl# 设置中文显示字体 mpl.rcParams["font.sans-serif"] ["SimHei"]def LCM_computation(patch_LCM_in):row, col patch_L…...

振德医疗选择泛微千里聆RPA,助力电商、人事业务流程自动化
振德医疗用品股份有限公司成立于1994年,中国A股上市公司,是医用敷料和感控防护产品主要的供应商之一。 (图片素材来自振德医疗官网) 振德医疗的业务在线上线下齐发力。目前拥有5个国内生产基地,3个海外工厂࿰…...

VBA高级应用30例应用3在Excel中的ListObject对象:创建表
《VBA高级应用30例》(版权10178985),是我推出的第十套教程,教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开,这套教程案例与理论结合,紧贴“实战”,并做“战术总结”,以…...

IP 地址在 SQL 注入攻击中的作用及防范策略
数据库在各个领域的逐步应用,其安全性也备受关注。SQL 注入攻击作为一种常见的数据库攻击手段,给网络安全带来了巨大威胁。今天我们来聊一聊SQL 注入攻击的基本知识。 SQL 注入攻击的基本原理 SQL 注入是通过将恶意的 SQL 代码插入到输入参数中…...
Unity VR黑屏
picosdk里面的,有修改 using System.Collections; using System.Collections.Generic; using UnityEngine;public class ScreenFade : MonoBehaviour {[Tooltip("颜色")]public Color fadeColor new Color(0.0f, 0.0f, 0.0f, 1.0f);private int renderQ…...
Vue.js 中使用 Watcher 的强大场景和案例
目录 表单验证 示例代码: HTML: 获取 API 数据 示例代码: HTML: 深度监听对象变化 示例代码: HTML: 观察多个数据源 示例代码: HTML: Vue.js 是一个流行的前端框架,以其直观的数据绑定和组件驱动的开发模式而闻名。其中,watch 功能是其响应式编程模型…...

《实现 DevOps 平台(2) · GitLab CI/CD 交互》
📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…...

【机器学习sklearn实战】岭回归、Lasso回归和弹性网络
一 sklean中模型详解 1.1 Ride regression 1.2 Lasso regression 1.3 ElasticNet 二 算法实战 2.1 导入包 import numpy as np import pandas as pd from sklearn import datasets from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.linear…...
Python 爬虫项目实战六:抓取猫眼电影排行榜的数据
在这篇博客中,我们将通过一个实际的Python爬虫项目,详细讲解如何抓取网页数据。本次选择的实战项目是抓取猫眼电影排行榜的数据,通过这个项目,你将学会如何使用Python编写爬虫,从网页中提取有用的电影信息。 一、项目…...

YOLO系列:从yolov1至yolov8的进阶之路 持续更新中
一、基本概念 1.YOLO简介 YOLO(You Only Look Once):是一种基于深度神经网络的对象识别和定位算法,其最大的特点是运行速度很快,可以用于实时系统。 2.目标检测算法 RCNN:该系列算法实现主要为两个步骤&…...

欧拉系统离线安装界面ukui
1、官网下载安装镜像iso后,默认没有gui openEuler | 开源社区 | openEuler社区官网openEuler是一个开源、免费的 Linux 发行版平台,将通过开放的社区形式与全球的开发者共同构建一个开放、多元和架构包容的软件生态体系。同时,openEuler 也是…...
Milvus向量数据库的简介以及用途
Milvus 是一个开源的向量数据库,专门用于处理和存储高维向量数据。它可以高效地支持各种数据科学和机器学习应用,特别是在涉及到大规模相似度搜索和推荐系统等领域。 以下是 Milvus 的简介以及它的主要用途。 1. Milvus 简介 Milvus 是由 Zilliz 开发的开源分布式向量数据库…...

恒创科技:IPv4 和 IPv6 之间的主要区别
IPv4 和 IPv6 是互联网协议 (IP) 系统中使用的两种版本的 IP 地址格式。虽然它们的主要目的是准确识别、发送和接收互联网上的数据,但 IPv4 和 IPv6 之间存在许多关键差异。 地址格式 IPv4 采用 32 位格式,由 4 个数值(称为八位字节)表示,以点…...

TinyWebserver的复现与改进(1):服务器环境的搭建与测试
计划开一个新坑, 主要是复现qinguoyi/TinyWebServer项目,并且使用其它模块提升性能。 本文开发服务器配置:腾讯云轻量级服务器,CPU - 2核 内存 - 2GB,操作系统 Ubuntu Server 18.04.1 LTS 64bit 打开端口 需要打开服务器3306、80…...

【Python】练习题附带答案
1、使用for循环实现输出9*9乘法表 代码: 2、写代码实现累乘计算器。 示例:用户输入:5*9*87输出答案:3915 代码: 3、写代码实现,循环提示用户输入的内容(Q/q终止循环),…...

Springboot集成Proguard生成混淆jar包
背景 当我们需要将 JAR 包交付给第三方时,常常担心代码可能会被反编译。因此,对 JAR 包进行混淆处理显得尤为重要。 市面上有许多 JAR 包源码混淆工具,但真正能稳定投入使用的并不多。例如,ClassFinal (ClassFinal: Java字节码加…...

什么是NLP分词(Tokenization)
在自然语言处理和机器学习的领域里,咱们得聊聊一个超基础的技巧——就是“分词”啦。这个技巧啊,就是把一长串的文字切分成小块,让机器能更容易地“消化”。这些小块,不管大小,单个的字符也好,整个的单词也…...
基于深度学习的图像伪造检测
基于深度学习的图像伪造检测主要利用深度学习技术来识别和检测伪造的图像内容,尤其是在生成对抗网络(GAN)等技术发展的背景下,伪造图像的逼真程度大大提升。图像伪造检测在信息安全、隐私保护、司法鉴定等领域具有重要意义。以下是…...
Windows11 WSL2 Ubuntu编译安装perf工具
在Windows 11上通过WSL2安装并编译perf工具(Linux性能分析工具)可以按以下步骤进行。perf工具通常与Linux内核一起发布,因此你需要确保你的内核版本和perf版本匹配。以下是安装和编译perf的步骤: 1. 更新并升级系统 首先&#x…...

探索算法系列 - 前缀和算法
目录 一维前缀和(原题链接) 二维前缀和(原题链接) 寻找数组的中心下标(原题链接) 除自身以外数组的乘积(原题链接) 和为 K 的子数组(原题链接) 和可被 …...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...