当前位置: 首页 > article >正文

影像技术实战12:图片清晰度评估不准?Laplacian、Tenengrad、噪声干扰与模糊图片批量筛选方案

影像技术实战12图片清晰度评估不准Laplacian、Tenengrad、噪声干扰与模糊图片批量筛选方案一、问题场景数据集里混入模糊图模型效果怎么调都上不去在图像识别、OCR、人脸识别、商品图审核、视频抽帧数据清洗中经常遇到一个问题图片能打开但画面不可用。比如1. OCR 图片文字是糊的 2. 人脸图失焦 3. 商品图运动模糊 4. 视频抽帧截到快速运动帧 5. 用户上传头像分辨率太低 6. 数据集中混入大量低质量图片我之前做数据集清洗时遇到过一个很典型的问题模型训练指标一直上不去排查模型、学习率、增强策略都没发现明显问题。最后抽样看数据发现某个类别里接近 20% 是模糊图。模型不是学不会而是数据本身不干净。本文解决的问题如何用 OpenCV 构建一套可复现的图片清晰度评估工具批量筛出模糊图并输出可复查报告二、真实问题清晰度不是一个绝对值网上经常看到这种代码scorecv2.Laplacian(gray,cv2.CV_64F).var()然后给一个固定阈值score 100 就是模糊这个说法不严谨。原因是1. 不同图片类型分数分布不同 2. 高噪声图片也可能分数高 3. 文字图和风景图不能用同一阈值 4. 小图和大图不能直接比较 5. 纯色图低分不代表不可用所以工程里的做法不是“找一个万能阈值”而是统一输入尺度 计算多个指标 输出报告 人工抽查边界样本 按业务场景确定阈值三、架构解释清晰度检测模块怎么设计推荐结构image-sharpness-checker/ ├── app.py ├── quality/ │ ├── metrics.py # 清晰度指标 │ ├── normalize.py # 尺寸归一化 │ ├── classifier.py # 阈值判断 │ └── report.py # CSV 报告 ├── data/ │ ├── input/ │ ├── good/ │ ├── bad/ │ └── borderline/ └── requirements.txt流程扫描图片 ↓ 读取并校验 ↓ 统一缩放到固定宽度 ↓ 计算 Laplacian ↓ 计算 Tenengrad ↓ 根据阈值分类 ↓ 输出 good / bad / borderline ↓ 生成 CSV 报告为什么要有 borderline因为清晰度检测不是绝对判断。边界样本最需要人工复查。四、环境准备mkdirimage-sharpness-checkercdimage-sharpness-checker python-mvenv venv安装依赖pipinstallopencv-python4.9.0.80numpy1.26.4五、第一步统一图片尺寸创建quality/normalize.pyimportcv2defread_and_resize(image_path:str,target_width:int640):imagecv2.imread(image_path)ifimageisNone:raiseRuntimeError(fcannot read image:{image_path})h,wimage.shape[:2]ifw0orh0:raiseValueError(invalid image size)ifwtarget_width:returnimage ratiotarget_width/w target_heightint(h*ratio)resizedcv2.resize(image,(target_width,target_height),interpolationcv2.INTER_AREAifratio1elsecv2.INTER_CUBIC)returnresized为什么要统一尺寸因为不同分辨率下Laplacian 分数不完全可比。统一宽度后阈值更稳定。六、第二步实现清晰度指标创建quality/metrics.pyimportcv2importnumpyasnpdeflaplacian_score(image)-float:graycv2.cvtColor(image,cv2.COLOR_BGR2GRAY)returnfloat(cv2.Laplacian(gray,cv2.CV_64F).var())deftenengrad_score(image)-float:graycv2.cvtColor(image,cv2.COLOR_BGR2GRAY)gxcv2.Sobel(gray,cv2.CV_64F,1,0,ksize3)gycv2.Sobel(gray,cv2.CV_64F,0,1,ksize3)magnitudenp.sqrt(gx**2gy**2)returnfloat(np.mean(magnitude))defbrightness_score(image)-float:graycv2.cvtColor(image,cv2.COLOR_BGR2GRAY)returnfloat(np.mean(gray))指标解释Laplacian对边缘和高频敏感常用于模糊检测 Tenengrad基于 Sobel 梯度更偏向边缘强度 Brightness辅助判断过暗图片七、第三步分类逻辑创建quality/classifier.pydefclassify_quality(laplacian:float,tenengrad:float,brightness:float,bad_lap_threshold:float60,good_lap_threshold:float130,min_brightness:float20): 返回 - good清晰 - bad模糊或过暗 - borderline边界样本需要人工复查 ifbrightnessmin_brightness:returnbad,too_darkiflaplacianbad_lap_threshold:returnbad,blurryiflaplaciangood_lap_threshold:returngood,sharpreturnborderline,need_review这里故意没有做成二分类而是三分类good可以直接保留 bad明显不可用 borderline需要人工抽查这是工程上更稳的做法。八、第四步批量检测脚本创建app.pyimportosimportcsvimportshutilimportargparsefromquality.normalizeimportread_and_resizefromquality.metricsimportlaplacian_score,tenengrad_score,brightness_scorefromquality.classifierimportclassify_qualitydefensure_dirs(*dirs):fordindirs:os.makedirs(d,exist_okTrue)defmain():parserargparse.ArgumentParser()parser.add_argument(--input-dir,requiredTrue)parser.add_argument(--output-dir,defaultdata/output)parser.add_argument(--bad-lap,typefloat,default60)parser.add_argument(--good-lap,typefloat,default130)parser.add_argument(--report,defaultsharpness_report.csv)argsparser.parse_args()good_diros.path.join(args.output_dir,good)bad_diros.path.join(args.output_dir,bad)borderline_diros.path.join(args.output_dir,borderline)ensure_dirs(good_dir,bad_dir,borderline_dir)valid_exts{.jpg,.jpeg,.png,.webp,.bmp}rows[]fornameinos.listdir(args.input_dir):extos.path.splitext(name)[1].lower()ifextnotinvalid_exts:continuepathos.path.join(args.input_dir,name)try:imageread_and_resize(path,target_width640)laplaplacian_score(image)tentenengrad_score(image)brightbrightness_score(image)status,reasonclassify_quality(laplacianlap,tenengradten,brightnessbright,bad_lap_thresholdargs.bad_lap,good_lap_thresholdargs.good_lap)ifstatusgood:target_dirgood_direlifstatusbad:target_dirbad_direlse:target_dirborderline_dir shutil.copy2(path,os.path.join(target_dir,name))rows.append({filename:name,laplacian:round(lap,4),tenengrad:round(ten,4),brightness:round(bright,4),status:status,reason:reason})exceptExceptionase:rows.append({filename:name,status:error,reason:str(e)})keyssorted(set().union(*(row.keys()forrowinrows)))withopen(args.report,w,newline,encodingutf-8)asf:writercsv.DictWriter(f,fieldnameskeys)writer.writeheader()writer.writerows(rows)print(report saved:,args.report)if__name____main__:main()运行python app.py --input-dir data/input --output-dir data/output --bad-lap60--good-lap130九、验证结果如何确定阈值是否合理生成报告后用 Pandas 看分布importpandasaspd dfpd.read_csv(sharpness_report.csv)print(df[status].value_counts())print(df.groupby(status)[laplacian].describe())然后重点人工检查bad 目录中分数最高的 20 张 good 目录中分数最低的 20 张 borderline 目录全部或抽样阈值不是一次定死的而是通过真实数据校准出来的。十、踩坑记录坑 1高噪声图片被误判为清晰噪声也是高频信息会抬高 Laplacian 分数。解决思路结合 Tenengrad 先轻度降噪再计算 人工检查高分异常样本坑 2纯色图被判模糊纯色图没有边缘分数低但不一定是坏图。例如Logo UI 图标 纯色背景 渐变素材这类业务要单独处理。坑 3不同类别图片共用阈值人脸图、商品图、文档图、风景图清晰度分布都不同。正式数据集建议按类别统计阈值。坑 4不保留 borderline如果只分 good/bad边界样本很容易误杀。十一、适合收藏清晰度评估工程流程1. 收集真实业务图片 2. 统一缩放到固定宽度 3. 计算 Laplacian 4. 计算 Tenengrad 5. 增加亮度检查 6. 设置 bad / good 两个阈值 7. 中间区域归为 borderline 8. 输出 good / bad / borderline 目录 9. 生成人工复查报告 10. 根据复查结果调整阈值十二、避坑清单1. 不要照搬网上固定阈值 2. 不要不统一尺寸就比较分数 3. 不要只用单一指标 4. 不要忽略噪声干扰 5. 不要把低纹理图全部判坏 6. 不要直接删除 bad 图 7. 不要忽略 borderline 样本 8. 不要不做人工抽查十三、总结与优化建议图片清晰度评估不是为了得到一个“绝对清晰分”而是为了在工程流程中提前拦截低质量数据。建议Laplacian 做主指标 Tenengrad 做辅助指标 亮度做异常过滤 borderline 做人工复查 阈值用真实数据校准后续优化1. 针对人脸区域计算清晰度 2. 针对文字区域计算清晰度 3. 增加噪声估计 4. 使用无参考图像质量评估模型 5. 接入数据集清洗流水线模型效果不好时不要只盯着模型参数先看看你的图片数据是不是清晰、干净、可用。

相关文章:

影像技术实战12:图片清晰度评估不准?Laplacian、Tenengrad、噪声干扰与模糊图片批量筛选方案

影像技术实战12:图片清晰度评估不准?Laplacian、Tenengrad、噪声干扰与模糊图片批量筛选方案 一、问题场景:数据集里混入模糊图,模型效果怎么调都上不去 在图像识别、OCR、人脸识别、商品图审核、视频抽帧数据清洗中,经…...

影像技术实战11:视频封面生成黑屏、模糊、重复?FFmpeg + OpenCV 构建高质量缩略图自动优选方案

影像技术实战11:视频封面生成黑屏、模糊、重复?FFmpeg OpenCV 构建高质量缩略图自动优选方案 一、问题场景:封面不是“随便截一帧” 在视频平台、素材管理系统、内容审核后台、AI 剪辑工具里,视频上传后自动生成封面是一个很常见…...

HT4182:5V 输入 1.6A 同步升压双节锂电充电器,高集成全保护可 P2P 替代

在便携式音箱、POS 机、电子烟、对讲机等采用双节串联锂电池供电的设备中,5V USB 输入升压充电是最主流的方案,市场对充电效率、集成度和可靠性的要求越来越高。HT4182 作为一款专为 5V 输入优化的同步升压型双节锂电池充电器,凭借高转换效率…...

LongWriter实战教程:从零开始构建你的专属写作AI

LongWriter实战教程:从零开始构建你的专属写作AI 【免费下载链接】LongWriter [ICLR 2025] LongWriter: Unleashing 10,000 Word Generation from Long Context LLMs 项目地址: https://gitcode.com/gh_mirrors/lo/LongWriter LongWriter是一款基于长上下文L…...

MacOS MySQL安装

1、安装包下载地址 MySQL Community Server:开源版本,适用于个人和小型企业。MySQL Enterprise Edition:商业版本,提供额外的功能和技术支持。MySQL Cluster:分布式数据库系统,适用于高可用性和高并发场景…...

为什么93%的AI法律助手查不准《数据安全法》实施细则?Perplexity这项冷启动参数设置决定成败

更多请点击: https://codechina.net 第一章:Perplexity法规查询功能的底层架构原理 Perplexity法规查询功能并非基于传统关键词匹配的搜索引擎,而是构建在多层语义理解与结构化知识协同推理的基础之上。其核心由法规知识图谱、实时语义解析引…...

5秒完成B站缓存视频转换:m4s到MP4无损转换完整指南

5秒完成B站缓存视频转换:m4s到MP4无损转换完整指南 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾为B站缓存视频无法在其他…...

影刀RPA里藏了个Python?手把手教你用它管理第三方包和写数据处理脚本

影刀RPA中的Python开发实战:从包管理到数据处理脚本集成 在自动化流程开发领域,影刀RPA正逐渐成为连接低代码操作与专业编程的桥梁。对于已经掌握Python基础但希望提升自动化效率的开发者而言,影刀RPA提供的Python集成能力堪称效率倍增器。本…...

从YOLOv5到昇腾NPU:一份避坑无数的PyTorch模型迁移实战笔记(含性能调优)

从YOLOv5到昇腾NPU:一份避坑无数的PyTorch模型迁移实战笔记(含性能调优) 去年接手一个工业质检项目时,客户要求在昇腾NPU上部署YOLOv5模型。本以为只是简单的环境适配,没想到从驱动安装到性能调优,整整踩了…...

终极指南:如何用免费C工具快速管理天龙八部单机版游戏数据

终极指南:如何用免费C#工具快速管理天龙八部单机版游戏数据 【免费下载链接】TlbbGmTool 某网络游戏的单机版本GM工具 项目地址: https://gitcode.com/gh_mirrors/tl/TlbbGmTool 还在为《天龙八部》单机版的数据管理而烦恼吗?TlbbGmTool是一款专为…...

Python随机密码生成器实战

求赞 求关注 当然写的不怎么好,因为我才刚初一,更新速度也慢。 如果想下载这里有链接 https://download.csdn.net/download/mc54321/91240180 正文开始 在编写这个程序我们需要导入random模块。 import random random 模块是 Python 标准库中的一个…...

Perplexity提示工程精要(2024权威认证版):覆盖92%高频场景的12类黄金模板

更多请点击: https://intelliparadigm.com 第一章:Perplexity提示工程的核心原理与认知框架 Perplexity(困惑度)作为衡量语言模型预测能力的关键指标,其本质是模型对真实文本序列分布的负对数似然指数化表达。在提示工…...

YOLOv8铁轨轨道缺陷识别检测系统(项目源码+YOLO数据集+模型权重+UI界面+python+深度学习+环境配置)

摘要 针对铁轨表面缺陷自动化检测需求,本研究构建了基于YOLOv8的实时检测系统,涵盖Spalling(剥落)、Wheel Burn(车轮烧伤)、Squat(轨头压溃)和Corrugation(波浪磨耗&…...

MIPI CSI-2(3) 逃逸/LP模式 传输详解和波形图

专栏目录 MIPI CSI-2(1) D-PHY详细解析 MIPI CSI-2(2) HS模式 传输详解和波形图 MIPI CSI-2(3) 逃逸/LP模式 传输详解和波形图 逃逸模式时序 逃逸模式下lane始终通过LP-TX驱动,不要求有时钟&…...

Perplexity移动端体验崩塌实录:iOS/Android双平台1372条崩溃日志聚类分析,含Google Play App Store差评时间戳热力图

更多请点击: https://codechina.net 第一章:Perplexity用户评论汇总 Perplexity AI 作为一款以“引用驱动”为特色的问答式搜索引擎,自上线以来持续吸引学术研究者、开发者与技术爱好者群体。其用户评论呈现高度两极化特征:一方面…...

如何高效使用Display Driver Uninstaller:显卡驱动清理终极指南

如何高效使用Display Driver Uninstaller:显卡驱动清理终极指南 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers-uni…...

如何快速构建跨平台GUI应用:awesome-zig项目中Capy与ZWL框架终极指南

如何快速构建跨平台GUI应用:awesome-zig项目中Capy与ZWL框架终极指南 【免费下载链接】awesome-zig A collaborative list of awesome Zig libraries and resources. 项目地址: https://gitcode.com/gh_mirrors/awe/awesome-zig 想要用Zig语言开发跨平台桌面…...

CANN/asc-devkit流水线屏障同步API

PipeBarrier(ISASI) 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://git…...

DocQuery最佳实践:企业文档自动化处理的10个技巧

DocQuery最佳实践:企业文档自动化处理的10个技巧 【免费下载链接】docquery An easy way to extract information from documents 项目地址: https://gitcode.com/gh_mirrors/do/docquery DocQuery是一款强大的文档信息提取工具,能轻松分析半结构…...

实战应用场景:Codex CLI在开发工作流中的最佳实践

实战应用场景:Codex CLI在开发工作流中的最佳实践 本文详细介绍了Codex CLI在现代化开发工作流中的四个关键应用场景:代码重构与组件现代化迁移、自动化测试生成与执行、安全漏洞扫描与代码审查、以及批量文件操作与Git集成。通过实际案例展示了如何利用…...

tensorrt_demos性能对比分析:FP16 vs INT8 vs DLA核心的优劣对比

tensorrt_demos性能对比分析:FP16 vs INT8 vs DLA核心的优劣对比 【免费下载链接】tensorrt_demos TensorRT MODNet, YOLOv4, YOLOv3, SSD, MTCNN, and GoogLeNet 项目地址: https://gitcode.com/gh_mirrors/te/tensorrt_demos tensorrt_demos是一个支持MODN…...

ARMv8.3指针认证技术原理与安全实践

1. AArch64指针认证技术深度解析指针认证(Pointer Authentication)是ARMv8.3-A引入的关键安全特性,通过在指针的高位比特中嵌入加密签名(Pointer Authentication Code, PAC)来验证指针的完整性。这项技术能有效防御ROP…...

ComfyUI Portrait Master中文版:终极AI肖像提示词生成指南

ComfyUI Portrait Master中文版:终极AI肖像提示词生成指南 【免费下载链接】comfyui-portrait-master-zh-cn 肖像大师 中文版 comfyui-portrait-master 项目地址: https://gitcode.com/gh_mirrors/co/comfyui-portrait-master-zh-cn ComfyUI Portrait Master…...

保姆级教程:用HackRF One复现汽车钥匙重放攻击(附完整命令与避坑点)

从零掌握HackRF One信号重放:433MHz汽车钥匙实战全解析 当你在停车场按下车钥匙按钮时,那串看似神秘的无线电波背后隐藏着怎样的安全漏洞?作为硬件安全领域的入门神器,HackRF One让普通爱好者也能窥探射频世界的奥秘。本文将带你用…...

FreeRTOS移植避坑指南:当你的芯片不在官方支持列表时(以S3C2440为例)

FreeRTOS移植实战:非官方支持芯片的定制化开发方法论 当你的项目需要将FreeRTOS移植到非官方支持芯片时,整个过程就像在未知海域航行——没有现成的海图,但掌握正确的导航方法同样能到达目的地。以经典的ARM9芯片S3C2440为例,这种…...

DPM-Solver代码架构解析:从模型包装器到求解器核心

DPM-Solver代码架构解析:从模型包装器到求解器核心 【免费下载链接】dpm-solver Official code for "DPM-Solver: A Fast ODE Solver for Diffusion Probabilistic Model Sampling in Around 10 Steps" (Neurips 2022 Oral) 项目地址: https://gitcode.…...

加密货币交易的AI革命:awesome-deep-trading中的区块链量化策略终极指南 [特殊字符]

加密货币交易的AI革命:awesome-deep-trading中的区块链量化策略终极指南 🚀 【免费下载链接】awesome-deep-trading List of awesome resources for machine learning-based algorithmic trading 项目地址: https://gitcode.com/gh_mirrors/aw/awesome…...

Lusca CSP策略完全指南:构建安全的内容安全策略

Lusca CSP策略完全指南:构建安全的内容安全策略 【免费下载链接】lusca Application security for express apps. 项目地址: https://gitcode.com/gh_mirrors/lu/lusca Lusca是一款专为Express应用打造的安全中间件,提供了全面的内容安全策略&…...

PHP Font Lib 与其他字体库对比:为什么它是 PHP 开发者的首选

PHP Font Lib 与其他字体库对比:为什么它是 PHP 开发者的首选 【免费下载链接】php-font-lib A library to read, parse, export and make subsets of different types of font files. 项目地址: https://gitcode.com/gh_mirrors/ph/php-font-lib 在PHP开发领…...

别再死记公式了!用Cadence Virtuoso手把手仿真折叠Cascode运放的增益与带宽

折叠Cascode运放仿真实战:从理论到波形的完整验证指南 在模拟IC设计的海洋里,折叠Cascode运算放大器就像一艘兼具速度与稳定性的快艇——它能提供高增益、宽带宽和良好的输出摆幅。但当你从教科书走向Cadence Virtuoso的仿真界面时,是否经常遇…...