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

嵌入式图像处理(五):整合 —— 从单一帧到完整质量报告

前几篇的工具各自跑各自的,每次要手动输命令、记参数、对比输出。太散了。这篇把所有模块拼成一个大号工具——iq_analyzer,输入一帧 YUYV,一次跑完亮度、曝光、色彩、噪点、清晰度五维分析,直接出综合评分。外加 JSON 导出。


1. 文件结构

六个源文件 + 一个头文件,Makefile 管编译:

  • iq_analyzer.h— 四个 report 结构体,所有模块共享
  • iq_analyzer.c— main(),参数解析 → 读帧 → 调各模块 → 出报告
  • luminance.c— 亮度统计(直方图/均值/std/median/曝光)
  • color.c— 色彩分析(U/V 均值 → 偏色方向)
  • noise.c— 噪点评估(空间域相邻像素差方差)
  • sharpness.c— 清晰度(Sobel 3×3 边缘能量,新算法)
  • report.c— 加权评分 + 终端输出 + JSON 导出
typedefstruct{doublemean,stddev;intmedian,min,max,hist[256];doubleover_pct,under_pct;intdyn_range;constchar*status;}LumReport;typedefstruct{doubleu_mean,v_mean;constchar*cast;}ColorReport;typedefstruct{doubley_noise_var,uv_noise_var;constchar*y_level,*uv_level;}NoiseReport;typedefstruct{doubleedge_energy;constchar*level;}SharpReport;

分析的对象就是之前拍的那帧——关掉 AWB 和锐化后的原始画面:


2. 亮度统计

和之前 frame_analyzer 不太一样——这里所有统计从直方图算,不是从原始像素数组。先建一次 256 桶 histogram,后续全是 O(256):

/* 均值:加权求和 */sum=0.0;for(i=0;i<256;i++)sum+=i*hist[i];r.mean=sum/total;/* 标准差:同样从直方图算 */sum=0.0;for(i=0;i<256;i++){doublediff=i-r.mean;sum+=diff*diff*hist[i];}r.stddev=sqrt(sum/total);/* 中位数:累加直方图到 halfway */sum=0.0;for(i=0;i<256;i++){sum+=hist[i];if(sum>=total/2){r.median=i;break;}}

曝光用累积分布的 P1 和 P99 间距作为动态范围,比之前简单的 0-255 范围更鲁棒。


3. 偏色检测

YUYV 里每 4 字节有 1 个 U 和 1 个 V。遍历取均值后,看 UV 偏离 128 的方向和幅度:

du=u_mean-128.0;dv=v_mean-128.0;if(fabs(du)<3&&fabs(dv)<3)r.cast="neutral";elseif(dv>5)r.cast="warm";elseif(dv<-5)r.cast="cool";elseif(du>5)r.cast="magenta";elseif(du<-5)r.cast="green";elser.cast="slight cast";

阈值是试出来的——3 以内肉眼基本看不出偏色,5 以上方向明确。


4. 噪点评估

用最简单的水平相邻像素差方差。值越小说明相邻像素越接近,画面越干净:

for(y_idx=0;y_idx<h;y_idx++){for(x=0;x<w-1;x++){diff=y_plane[y_idx*w+x]-y_plane[y_idx*w+x+1];y_sum+=diff*diff;y_cnt++;}}r.y_noise_var=y_sum/y_cnt;

UV 噪点用同样逻辑,但每 2 行 2 列采样一次——色度通道天然低分辨率,全采样没意义。


5. 清晰度:Sobel 边缘能量

这是前面没涉及的新模块。思路很直觉:清晰图像的边缘锐利、亮度落差大;模糊图像边缘平缓、落差小。

Sobel 算子用两个 3×3 核分别测水平和垂直梯度:

Sobel X: Sobel Y: [-1 0 +1] [-1 -2 -1] [-2 0 +2] [ 0 0 0] [-1 0 +1] [+1 +2 +1]

对每个内部像素(跳过边界 1px)算 gx 和 gy,梯度幅值mag = sqrt(gx² + gy²),全体取均值:

for(y_idx=1;y_idx<h-1;y_idx++){for(x=1;x<w-1;x++){gx=-1*y[(y_idx-1)*w+(x-1)]+1*y[(y_idx-1)*w+(x+1)]-2*y[y_idx*w+(x-1)]+2*y[y_idx*w+(x+1)]-1*y[(y_idx+1)*w+(x-1)]+1*y[(y_idx+1)*w+(x+1)];gy=-1*y[(y_idx-1)*w+(x-1)]-2*y[(y_idx-1)*w+x]-1*y[(y_idx-1)*w+(x+1)]+1*y[(y_idx+1)*w+(x-1)]+2*y[(y_idx+1)*w+x]+1*y[(y_idx+1)*w+(x+1)];mag=sqrt(gx*gx+gy*gy);sum+=mag;count++;}}r.edge_energy=sum/count;

edge_energy < 15 判 soft,< 30 判 normal,以上 sharp。


6. 综合评分

五项加权,满分 10。亮度占 30%(最重要——人眼先看亮度),曝光和色彩各 20%,噪点和清晰度各 15%:

lum_s=clamp(1.0-fabs(l.mean-120)/80,0.0,1.0);exp_s=clamp(1.0-(l.over_pct+l.under_pct)/25,0.0,1.0);col_s=strcmp(c.cast,"neutral")==0?1.0:0.5;noise_s=strcmp(n.y_level,"clean")==0?1.0:0.5;sharp_s=strcmp(s.level,"normal")==0?1.0:0.5;score=(lum_s*0.30+exp_s*0.20+col_s*0.20+noise_s*0.15+sharp_s*0.15)*10;

权重和阈值是我自己拍的——没有标准参考,纯凭调试感觉。生产中的 ISP 评分系统远比这个复杂,但核心思路一样:多维打分、加权综合。

白平衡加增强后的实际输出:

=== Image Quality Analysis Report === LUMINANCE Mean: 169.7 (normal) StdDev: 69.8 Median: 184 Min/Max: 17 / 255 EXPOSURE Over-exposed: 28.0% Dynamic Range: 209 COLOR U Mean: 124.2 Cast: cool NOISE Y Noise Var: 44.2 (heavy) UV Noise Var: 131.4 (heavy) SHARPNESS Edge Energy: 30.3 (sharp) OVERALL SCORE: 3.6 / 10

7. 完整管线

三个工具串成管线:

原始帧 → auto_wb (Gray World) → image_enhance → iq_analyzer → JSON 报告

三步处理后,原始帧从偏绿、噪声 24.5 变成白平衡校正 + 均衡化 + Gamma + 模糊的综合增强结果:


full_pipeline.sh一行跑完。


完整代码:github.com/cjh1230/learn-embedded-linux-video

http://www.jsqmd.com/news/899059/

相关文章:

  • APISIX 限流插件 `limit-count`
  • 如何永久保存微信聊天记录:开源工具的完整解决方案
  • 从机器学习基础到 MLP(下):神经网络为什么能起作用?
  • 2026年全国校园餐智慧监管平台品牌深度调研榜单(最新版) - 资讯快报
  • 网球手链品牌TOP5实测:戴过才知道这3款最值得入! - 资讯纵览
  • 这款 Gitee 低代码平台太狠了!零代码搭建系统,Java 程序员要失业了?
  • 落地复盘:AI Coding 助手在 50 人研发团队中的 6 个月实战报告
  • 论文榨汁机 · 用多智能体对话榨干每篇论文的精华
  • 强品牌,真赋能:嘉宝莉石艺漆两场渠道推广会圆满收官 - 资讯快报
  • 观察在ubuntu环境下通过taotoken调用大模型的延迟与稳定性表现
  • 终极指南:5分钟掌握webMAN MOD,让你的PS3变身全能游戏中心
  • Codex 桌面版 使用国内大模型系列一 | EchoBird
  • 小米 MiMo-V2.5 最高降价 99%:Token 战争背后,是一套押注 Agent 的工程算盘
  • Java 文件操作与 IO 流入门:从基础到实战,新手必看全攻略
  • MCP博客园工具集成测试v3
  • AI Coding 助手的未来:从补全到自主编程的演进与工程准备
  • 2026上海二奢回收避坑指南|6大维度实测,这几家零投诉门店公开 - GrowthUME
  • 2026年5月惠州设计装修行业研究报告:高性价比排行榜揭晓 - 资讯纵览
  • 2026年夹钳式超声波流量计十大品牌:十家优选深度解析 - 科技焦点
  • FPGA实现ANU轻量级密码:4位到32位数据路径架构的权衡与实践
  • 热度暴跌 99%!基于OpenClaw的腾讯套壳QClaw还值得用吗?
  • 2026年中山全屋照明灯具采购厂家筛选标准出炉 宏盟照明凭综合实力稳居行业优选首位 - 资讯纵览
  • 2026年宿迁木门厂家推荐榜:宿迁木门定做、宿迁铝门定做厂家选择指南,成艺门业的场景化工艺切入 - 海棠依旧大
  • 求解全局优化问题几类填充罚函数及算法【附代码】
  • 2026海南代理记账怎么选?5家靠谱机构实测排行榜,做账报税不踩坑 - 资讯快报
  • 2026替换液压油缸的优选方案:耐高温工业推杆推荐 - 资讯快报
  • 2026年5月工程信息平台革命:中项网助工程企业获客转型 - GrowthUME
  • 2026年活性炭厂家深层解析 - 资讯快报
  • 电力工程项目信息平台的数据价值:中项网如何提升设备企业获客效率 - GrowthUME
  • 2026年罗斯蒙特差压变送器国产平替:五家优选深度解析 - 科技焦点