阶段保存-国标 GB/T 17444-2013 盲元检测-python

发布时间:2026/10/24 2:49:57

阶段保存-国标 GB/T 17444-2013 盲元检测-python #用于验证数据及调用国标中盲元检测算法及添加计算三维噪声功能注文中算法经过AI的修正。供后续程序调用及参考# -*- coding: utf-8 -*- 国标 GB/T 17444-2013 盲元检测 - 死像元(d)响应率 R 0.5 * R_mean - 过热像元(h)噪声电压 VN 2 * VN_mean - 采用国标推荐的迭代剔除收敛算法 - 全向量化实现维度安全统一一维扁平索引最后再映射回二维标记 import numpy as np import os import cv2 as cv # 基础工具函数 def calculate_pixel_mean(file_path, frame_number, height, width): 计算所有帧对应像素的平均值一维扁平数组长度 height*width n_pixel height * width image_mean np.zeros(n_pixel, dtypenp.float64) files [os.path.join(file_path, f) for f in os.listdir(file_path)] for file in files: with open(file, rb) as fp: data np.fromfile(fp, dtypenp.uint16) if data.size ! n_pixel: raise ValueError(f文件 {file} 数据尺寸 {data.size} 与 {n_pixel} 不符) image_mean data.astype(np.float64) image_mean / frame_number return image_mean # 一维长度 height*width def calculate_pixel_V(file_dir_T0, file_dir_T, frame_number, height, width, K_gain): 像元响应电压 V_DS_mean (V_T - V_T0) / K_gain v_t0 calculate_pixel_mean(file_dir_T0, frame_number, height, width) v_t calculate_pixel_mean(file_dir_T, frame_number, height, width) return (v_t - v_t0) / float(K_gain) def calculate_P(T, T0, D, AD, L): 辐照功率差值 P单位一致即可cm/K 按国标公式 sigma 5.673e-12 ratio L / D n 1.0 if ratio 1 else 0.0 return sigma * (T**4 - T0**4) * AD / (4 * (ratio**2) n) def calculate_3d_noise(data_all): 三维噪声模型输入 (帧数, 行高, 列宽)返回 7 个噪声分量字典 t, v, h data_all.shape mu data_all.mean() mu_tvh data_all.mean(axis0) # (v, h) mu_tvh_rows data_all.mean(axis1) # (t, h) mu_tvh_cols data_all.mean(axis2) # (t, v) def var_mean(x): return np.mean(x**2) noise {} # 1. 时空噪声固定像素帧间变化 noise[时空噪声σ_tvh] np.sqrt(var_mean(data_all - mu_tvh[None, :, :])) # 2. 随机空间噪声固定图案噪声 noise[随机空间噪声σ_vh] np.sqrt(var_mean(mu_tvh - mu)) # 3. 行时间噪声 noise[行时间噪声σ_tv] np.sqrt(var_mean(mu_tvh_rows - mu_tvh_rows.mean(axis0)[None, :])) # 4. 列时间噪声 noise[列时间噪声σ_th] np.sqrt(var_mean(mu_tvh_cols - mu_tvh_cols.mean(axis0)[None, :])) # 5. 行固定噪声 noise[行固定噪声σ_v] np.sqrt(var_mean(mu_tvh_cols - mu_tvh_cols.mean(axis1, keepdimsTrue))) # 6. 列固定噪声 noise[列固定噪声σ_h] np.sqrt(var_mean(mu_tvh_rows - mu_tvh_rows.mean(axis1, keepdimsTrue))) # 7. 帧处理噪声时空耦合残留 residual data_all - (mu_tvh_rows[:, None, :] mu_tvh_cols[:, :, None] - mu) noise[帧处理噪声σ_t] np.sqrt(var_mean(residual)) return noise def calculate_noise_data(file_path, frame_number, height, width, K_gain): 计算噪声返回 (平均噪声电压标量, 逐像元噪声一维数组, 三维噪声字典) n_pixel height * width files [os.path.join(file_path, f) for f in os.listdir(file_path)] data_all np.zeros((frame_number, height, width), dtypenp.float64) for idx, file in enumerate(files): with open(file, rb) as fp: data np.fromfile(fp, dtypenp.uint16) if data.size ! n_pixel: raise ValueError(f文件 {file} 数据尺寸 {data.size} 与 {n_pixel} 不符) data_all[idx] data.reshape(height, width).astype(np.float64) # 逐像元帧间标准差样本标准差 ddof1 noise_img data_all.std(axis0, ddof1) # (height, width) noise_mean noise_img.sum() / n_pixel # 平均噪声电压 # 限位噪声过低时钳位到 0.2保证数值稳定 noise_img_safe np.where(noise_img 0.2, 0.2, noise_img) noise_result calculate_3d_noise(data_all) return float(noise_mean), noise_img_safe.ravel(), noise_result # 一维返回 # 国标迭代盲元检测主算法 def calculate_recommendation_algorithm( file_dir_T0, file_dir_T, frame_number, height, width, K_gain, T, T0, D, AD, L, save_mask_pathNone): 按国标推荐方法计算死像元(d)与过热像元(h) 返回: d_list(一维索引数组), h_list(一维索引数组), flag(二维掩膜 height x width) n_pixel height * width # 1. 像元响应电压 响应率 V_DS_mean calculate_pixel_V(file_dir_T0, file_dir_T, frame_number, height, width, K_gain) P calculate_P(T, T0, D, AD, L) R (V_DS_mean / P).ravel() if P ! 0 else np.zeros(n_pixel) # 2. 噪声数据一维 VN_mean, VN, noise3D calculate_noise_data(file_dir_T0, frame_number, height, width, K_gain) VN VN.ravel() R R.ravel() # 有效像元掩膜True仍参与统计的有效像元 valid np.ones(n_pixel, dtypebool) # 初始统计基于全部像元 R_mean R.mean() Vn_mean VN.mean() d_set set() h_set set() converged False for _ in range(100): # 迭代上限防止异常不收敛 # 当前有效索引 cur np.where(valid)[0] if cur.size 0: break R_mean R[cur].mean() Vn_mean VN[cur].mean() det_d 0 for idx in cur: if R[idx] 0.5 * R_mean: d_set.add(idx) valid[idx] False det_d 1 det_h 0 for idx in np.where(valid)[0]: if VN[idx] 2.0 * Vn_mean: h_set.add(idx) valid[idx] False det_h 1 d_cnt len(d_set) h_cnt len(h_set) # 国标收敛判据本轮新增占比均 0.1% ratio_d (det_d / d_cnt) if d_cnt 0 else 0.0 ratio_h (det_h / h_cnt) if h_cnt 0 else 0.0 if det_d 0 and det_h 0: converged True break if ratio_d 0.001 and ratio_h 0.001: converged True break d_list np.array(sorted(d_set), dtypenp.int64) h_list np.array(sorted(h_set), dtypenp.int64) # 最终基于收敛后的有效集重算一次均值供返回/日志 cur np.where(valid)[0] R_mean_final float(R[cur].mean()) if cur.size else 0.0 Vn_mean_final float(VN[cur].mean()) if cur.size else 0.0 # 盲元标记掩膜二维 flag np.zeros((height, width), dtypenp.uint8) for idx in d_list: i idx // width j idx % width flag[i, j] 1 for idx in h_list: i idx // width j idx % width flag[i, j] 1 if save_mask_path is not None: cv.imwrite(save_mask_path, flag) print(f[INFO] 迭代{收敛 if converged else 达上限}) print(f[INFO] 死像元 d {len(d_list)}, 过热像元 h {len(h_list)}, f盲元总数 {len(d_list) len(h_list)}) print(f[INFO] 最终 R_mean {R_mean_final:.4f}, VN_mean {Vn_mean_final:.4f}) return d_list, h_list, flag,noise3D # 主入口参数按需修改 if __name__ __main__: width 640 height 512 frame_number 100 K_gain 1.0 file_dir_T rD:\CorrectionPic\T file_dir_T0 rD:\CorrectionPic\T0 T 308.0 T0 293.0 D 4.0 AD 5.0 L 20.0 save_mask rD:\CorrectionPic\deadPixMask.png d_list, h_list, flag, noise3D calculate_recommendation_algorithm( file_dir_T0, file_dir_T, frame_number, height, width, K_gain, T, T0, D, AD, L, save_mask_pathsave_mask) print(f[INFO] 死像元坐标数: {len(d_list)}, 过热像元坐标数: {len(h_list)}) if len(d_list) 0: print(f[INFO] 死像元示例(前10): {d_list[:10].tolist()}) if len(h_list) 0: print(f[INFO] 过热像元示例(前10): {h_list[:10].tolist()}) print(noise3D)运行结果[INFO] 迭代收敛 [INFO] 死像元 d 628, 过热像元 h 31, 盲元总数 659 [INFO] 最终 R_mean 10364630.6662, VN_mean 9.5830 [INFO] 死像元坐标数: 628, 过热像元坐标数: 31 [INFO] 死像元示例(前10): [611, 629, 633, 636, 637, 638, 639, 640, 641, 1273] [INFO] 过热像元示例(前10): [0, 1, 2, 3, 628, 11815, 82699, 83072, 85384, 93913] {时空噪声σ_tvh: 9.78523670323088, 随机空间噪声σ_vh: 191.8465215825749, 行时间噪声σ_tv: 1.2903772476809168, 列时间噪声σ_th: 2.233019690143643, 行固定噪声σ_v: 78.1860079985119, 列固定噪声σ_h: 116.61049681874424, 帧处理噪声σ_t: 131.10979706190486}数据源为BIN文件格式的图像数据帧数为100帧
延伸阅读

更多相关文章

2026/10/21 9:19:27

涉密企业专利申请怎么公开

一、专利要公开,涉密技术不能公开——企业卡在中间专利制度的核心是“公开换保护”:你把技术方案说清楚,国家给你20年排他性权利。但涉密企业的技术受《保守国家秘密法》约束,技术一旦公开可能损害国家安全和利益。一个要公开&…

2026/10/22 11:24:07

【基于GO的Web开发9】gin框架返回json

一、JSON 渲染介绍在 Gin Web 开发中,前后端交互最常返回 JSON 格式数据,这个过程称为JSON 渲染。 核心 API:c.JSON(http状态码, 返回的数据)二、方法 1:map 方式返回 JSON原生使用map[string]interface{}构造数据package mainimp…

2026/10/24 2:48:02

8款降AI率工具实测测评:2026论文季避坑指南

每年一进入毕业季,后台问我降AI率工具怎么选的消息就会突然多起来,今年专科生问得尤其频繁。原因不外乎两类:学校这边对AI痕迹的审核越来越紧,大家手头却基本没有系统的应对方案。作为一个从检测系统早期版本就开始折腾这类工具、…

2026/10/24 2:48:02

Cacti流量监控系统在CentOS 7上的部署与配置实践

做运维的朋友应该都遇到过这个场景:业务那边反馈“服务器访问特别慢”,你登上去用ifconfig看了一眼,入方向流量确实跑满了,但要你说清楚是哪个时段开始的、持续了多久、是哪些端口在占,一时半会还真拿不出来。流量这个…

2026/10/24 2:48:02

从代码到架构:程序员认知升级的五个断层与六个训练

干了这么多年技术,我有一个特别明显的感受:很多程序员写代码的阶段根本没有瓶颈,真正的瓶颈出现在“把代码写对”之后。你能把接口设计得漂漂亮亮,也能在两周内交付一个模块,但一旦需要你来决定整个系统的走向、模块与…

2026/10/24 2:48:02

西门子与汇川PLC的Ethernet/IP通信:从原理到联调实战

在自动化项目现场摸爬滚打久了,你会发现一个很有意思的现象:选PLC的时候,大家总喜欢待在同一个生态里打转。西门子的配PROFINET,国外另一大主流生态则偏爱Ethernet/IP,国产PLC更多走Modbus TCP。前几年做某模拟项目X&a…

2026/10/24 2:48:02

计及氢能的综合能源优化调度Matlab实现解析

1. 项目概述:为什么要做计及氢能的综合能源优化调度做综合能源系统优化调度这几年,我见过不少刚入门的同学把目光盯在电、热、冷三种常规能源的耦合上,模型跑通了就以为万事大吉。但说实话,如今做园区级或区域级的综合能源系统&am…

2026/10/24 2:43:02

音乐与真人互动结合:Canary口语学习产品体验与设计解析

最近语言学习赛道在海外产品发现平台上很热闹,一款叫 Canary 的应用冲上了今日热榜。它的定位很有意思:用音乐学语言,靠真人互动练口语。这两个点单拎出来都不算新鲜,但放在一起做成产品,确实戳中了不少语言学习者的痛…

2026/10/23 22:56:35

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/24 0:02:40

MATLAB缩进快捷键与批量格式化实战指南

1. 被自动缩进折磨的那些年如果你写过MATLAB代码,大概率经历过这种场景:从某个文档、网页或者聊天记录里复制了一段代码,粘贴进编辑器之后,每一行前面都带着莫名其妙的空格,有的行首是四个空格,有的是一个T…

2026/10/24 0:02:40

用Poco实现Qt风格信号与槽的跨平台C++方案

简介:本资源是一份面向C中级开发者的技术实践工程,聚焦于在非Qt框架环境下模拟实现Qt核心通信机制——信号与槽,借助Poco网络库的事件系统完成解耦式对象通信。适用于需在跨平台C项目中引入松耦合回调机制、但受限于无法集成Qt依赖的开发场景…

2026/10/24 0:02:40

ESXi裸机虚拟化安装指南:从硬件兼容到虚拟机部署

1. 为什么还要折腾ESXi:从一台闲置机器说起手里攒了几台淘汰下来的迷你主机,配置不算差,i5加16G内存,扔了可惜,装个桌面系统又觉得浪费。这种场景下,ESXi就成了一个绕不开的选择。它是一套裸机虚拟化平台&a…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑