发布时间:2026/8/25 22:39:02
阶段保存-国标 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/8/25 22:34:01

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

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

2026/8/25 22:34:01

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

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

2026/8/26 5:34:47

杭电2016计算机考研机试真题解析与备考策略

1. 真题背景与价值解析2016年杭州电子科技大学计算机专业研究生复试机试真题,是反映该校计算机学科教学重点和考核方向的重要参考资料。作为浙江省属重点高校的计算机学科代表,杭电的机试题往往兼具基础性、实用性和一定创新性,能够有效检验考…

2026/8/26 5:34:47

FeRAM铁电存储器深度解析:原理、选型与嵌入式掉电保存实战

1. 项目概述:FeRAM到底是什么先直接把概念说透:Ferroelectric RAM,简称FeRAM,中文叫铁电随机存储器,是一种非易失性存储器。它既不像SRAM那样一断电就丢数据,也不像Flash那样写入要先擦除、速度还慢得让人着…

2026/8/26 5:34:47

嵌入式开发中结构体对齐原理与Hard Fault排查实战

1. 项目概述:为什么结构体对齐是嵌入式开发的必修课?最近在调试一个基于STM32F030的项目时,遇到了一个典型的“玄学”问题:代码逻辑看起来完全正确,但程序运行到某个特定函数时,会毫无征兆地触发Hard Fault…

2026/8/26 5:34:47

搜索引擎高级语法实战:web.title、web.body与domain精准检索指南

1. 这不是“黑科技”,而是被遗忘的搜索基本功“暗黑搜索引擎语法”这个词听起来像黑客电影里的台词,但其实它压根不涉及任何非法操作、漏洞利用或绕过机制。它只是指那些绝大多数普通用户从未系统学过、搜索引擎官方文档里也极少高亮强调、却能在几秒内把…

2026/8/26 5:34:46

嵌入式开发必知:结构体对齐原理、计算与实战避坑指南

1. 从一次Hard Fault说起:为什么我们需要理解结构体对齐那天下午,我正在调试一块基于STM32F030的板子,一个看似简单的数据包解析函数,在连续运行了几分钟后,毫无征兆地触发了Hard Fault,系统直接挂死。经过…

2026/8/25 1:04:19

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/25 11:48:27

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/25 16:56:43

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/26 0:04:32

Python random 模块常用函数详解:从入门到实战

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

2026/8/26 1:19:35

JSON总结

JSON概念 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,主要用于跟服务器进行交换数据。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C、C#、Java、JavaScr…

2026/8/26 1:19:35

保存连接sse 是什么原理,为什么不会一直请求

“保持连接”用的是 SSE(Server-Sent Events),本质是一个没有马上结束的 HTTP 请求。 过程是: 拷贝机发送一次请求: GET /api/code-sync/events服务器返回: Content-Type: text/event-stream但不关闭响应&…

2026/8/24 13:42:17

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/24 18:13:48

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/25 1:08:14

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…