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

ISP图像处理算法之Demosaic

ISP RAW图像处理算法之Demosaic ---- Zhang-Wu Directional LMMSE Image Demosaicking

  • 前言
  • ZhangWu Demosaic
    • 算法步骤
      • Directional Estimates方向估计/初步滤波
      • Fusion of the Directional Interpolations 方向差值融合
      • Obtaining the Red and Blue Channels 获取红/蓝通道
    • LMMSE
      • LMMSE Denoising

前言

最近在看ISP算法,被分配到了任务中有一项Demosaic去马赛克算法,用于RAW图转RGB。
多方查询后,效果较为理想的是Adam-Hamilton梯度自适应插值和一种基于LMMSE的方向线性最小均方误差方法—Zhang-Wu Directional LMMSE Image Demosaicking,这是目前看来效果除深度学习以外最好的算法了,先做了解。
Adam-Hamilton梯度自适应插值去马赛克方法和双线性差值法,这两种方法较为简单,但是在纹理密集的地方效果不理想,后续会更新这两种算法的去马赛克步骤。文末会给出参考论文地址。

ZhangWu Demosaic

利用通道色差近似的规则对色素差值进行了LMMSE滤波与噪声估计,提高的算法对纹理密集区域的处理效果。

算法步骤

这个算法核心应该是体现在对估计差值的处理上,算法基于差异信号是平滑这一经验基础上。算法主要分为以下几步:

Directional Estimates方向估计/初步滤波

该步骤主要是建立通道色差表。
算法使用线性插值和二阶拉普拉斯插值对颜色进行初步估计,以红绿像素行为例(蓝绿像素行同理):

  • 在已知红色像素值的的情况下需要估计绿色像素 G ^ n \hat {G}_n G^n
    G ^ n = 1 2 ( G n − 1 + G n + 1 ) − 1 4 ( R n − 2 − 2 R n + R n + 2 ) \hat {G}_n = \frac{1}{2}(G_{n-1}+G_{n+1}) - \frac{1}{4}({R_{n-2}-2R_{n}+R_{n+2}}) G^n=21(Gn1+Gn+1)41(Rn22Rn+Rn+2)
  • 在已知绿色像素值的的情况下需要估计红色像素 R ^ n \hat {R}_n R^n
    R ^ n = 1 2 ( R n − 1 + R n + 1 ) − 1 4 ( G n − 2 − 2 G n + G n + 2 ) \hat {R}_n = \frac{1}{2}(R_{n-1}+R_{n+1}) - \frac{1}{4}({G_{n-2}-2G_{n}+G_{n+2}}) R^n=21(Rn1+Rn+1)41(Gn22Gn+Gn+2)

可以看到 − 1 4 ( R n − 2 − 2 R n + R n + 2 ) - \frac{1}{4}({R_{n-2}-2R_{n}+R_{n+2}}) 41(Rn22Rn+Rn+2) 的部分是使用了一维二阶拉普拉斯插值空域核心 [ 1 , − 2 , 1 ] [1,-2,1] [1,2,1] 进行插值对绿色像素估计值进行了协助计算。然后利用估算值建立像素通道差值,计算方法如下:

  • 对已知红色像素的像素点进行计算时,当前像素点水平GR通道差值为:
    Φ ^ g , r h = G ^ − R n \hat{Φ}_{g,r}^h = \hat{G} - R_n Φ^g,rh=G^Rn
  • 对已知绿色像素的像素点进行计算时,当前像素点水平GR通道差值为:
    Φ ^ g , r h = G − R ^ n \hat{Φ}_{g,r}^h = G - \hat R_n Φ^g,rh=GR^n

其中 Φ ^ g , r h \hat{Φ}_{g,r}^h Φ^g,rh 表示在这个像素点在水平方向上插值计算出的R与G的差,对垂直方向重复上述步骤同样可以得到一个垂直方向上的差值信号 Φ ^ g , r v \hat{Φ}_{g,r}^v Φ^g,rv
对此可以构建出差值表,对于每个像素的位置都可以取得 Φ ^ v , Φ ^ h \hat{Φ}^v, \hat{Φ}^h Φ^v,Φ^h 随后使用近似高斯滤波器分别对其进行滤波,一维空域核为 [ 4 , 9 , 15 , 23 , 26 , 23 , 15 , 9 , 4 ] [4,9,15,23,26,23,15,9,4] [4,9,15,23,26,23,15,9,4],滤波器响应为:
h ( z ) = 26 128 + 23 128 ( z + z − 1 ) + 15 128 ( z 2 + z − 2 ) + 9 128 ( z 3 + z − 3 ) + 4 128 ( z 4 + z − 4 ) h(z) = \frac{26}{128} + \frac{23}{128}(z+z^{-1}) + \frac{15}{128}(z^2+z^{-2}) + \frac{9}{128}(z^3+z^{-3}) + \frac{4}{128}(z^4+z^{-4}) h(z)=12826+12823(z+z1)+12815(z2+z2)+1289(z3+z3)+1284(z4+z4)

Fusion of the Directional Interpolations 方向差值融合

在前一小节中计算得到的水平与垂直方向差将在这一小节中融合用作恢复像素。作者利用LMMSE选择了参数最小化估计的均方误差用作水平与垂直方向估计值的融合。
w = ( 1 − λ ) h + λ v w = (1-λ)h + λv w=(1λ)h+λv

  • w w w 为最终融合值 Φ g , r Φ_{g,r} Φg,r Φ g , b Φ_{g,b} Φg,b
  • h h h 为水平估计值 Φ ^ g , r h \hat{Φ}_{g,r}^h Φ^g,rh Φ ^ g , b h \hat{Φ}_{g,b}^h Φ^g,bh
  • v v v 为垂直估计值 Φ ^ g , r v \hat{Φ}_{g,r}^v Φ^g,rv Φ ^ g , b v \hat{Φ}_{g,b}^v Φ^g,bv
  • λ λ λ 为经过估计的最优参数,其计算方式如下:
    λ = σ h 2 σ h 2 + σ v 2 λ = \frac{σ^2_h}{σ^2_h + σ^2_v} λ=σh2+σv2σh2

至此,我们就可以通过融合得到的差值恢复出所有像素点的G通道值了。
G n , r = Φ g , r + R n G n , b = Φ g , b + B n G_{n,r} = {Φ}_{g,r} + R_n \\ G_{n,b} = {Φ}_{g,b} + B_n Gn,r=Φg,r+RnGn,b=Φg,b+Bn

Obtaining the Red and Blue Channels 获取红/蓝通道

经过前一步的操作后,我们恢复了所有的绿色像素值。因此目前像素整列上存在两种情况:
第一种,已知蓝色或红色像素值,并且已经恢复出了绿色像素值。对于该像素点,假如是蓝色,我们需要计算周围对角线上四个已知红色点像素值的GR差值的平均值来对该通道进行插值。
Φ g , r ( i , j ) = 1 4 ( Φ g , r ( i − 1 , j − 1 ) + Φ g , r ( i + 1 , j − 1 ) + Φ g , r ( i − 1 , j + 1 ) + Φ g , r ( i + 1 , j + 1 ) ) {Φ}_{g,r}(i,j) = \frac{1}{4}({Φ}_{g,r}(i-1,j-1) + {Φ}_{g,r}(i+1,j-1) + {Φ}_{g,r}(i-1,j+1) + {Φ}_{g,r}(i+1,j+1)) Φg,r(i,j)=41(Φg,r(i1,j1)+Φg,r(i+1,j1)+Φg,r(i1,j+1)+Φg,r(i+1,j+1))

对于红色通道,计算过程也类似。

第二种,只有绿色像素点已知,这种情况下需要在第一种情况计算完毕之后,利用该点上下左右四个点来插值。

Φ g , r ( i , j ) = 1 4 ( Φ g , r ( i − 1 , j ) + Φ g , r ( i + 1 , j ) + Φ g , r ( i , j + 1 ) + Φ g , r ( i , j − 1 ) ) {Φ}_{g,r}(i,j) = \frac{1}{4}({Φ}_{g,r}(i-1,j) + {Φ}_{g,r}(i+1,j) + {Φ}_{g,r}(i,j+1) + {Φ}_{g,r}(i,j-1)) Φg,r(i,j)=41(Φg,r(i1,j)+Φg,r(i+1,j)+Φg,r(i,j+1)+Φg,r(i,j1))

最后,
R = G − Φ g , r R = G - {Φ}_{g,r} R=GΦg,r
由此我们就恢复出了所有的像素信息。

LMMSE

LMMSE(Linear Minimum Mean Square Error,线性最小均方误差估计)​​ 是一种基于统计的最优线性估计方法,旨在通过线性模型最小化估计误差的均方值(MMSE)。

X ^ L M M S E = a ( Y − E [ Y ] ) + b (1) \hat{X}_{LMMSE} = a(Y - E[Y]) + b \tag{1} X^LMMSE=a(YE[Y])+b(1)

其中为了得到最优系数使均方误差最小化,要对a,b进行偏微分,这里直接给出结果,对过程有兴趣的可以下载论文查看或自行查询资料。

a = C o v ( X , Y ) V a r ( Y ) a = \frac{Cov(X,Y)}{Var(Y)} a=Var(Y)Cov(X,Y)

b = E [ X ] b = E[X] b=E[X]

  • E [ X ] E[X] E[X]是期望值
  • C o v ( X , Y ) Cov(X,Y) Cov(X,Y)是信号与观测的协方差
  • V a r ( Y ) Var(Y) Var(Y)是观测值的方差

LMMSE Denoising

基于上文最小均方误差估计的思想,论文作者提出了一种基于LMMSE去噪的融合模型。
首先,先对问题进行建模,作者认为自然图像的颜色通道具有很强的相关性,自然场景中的光照(如阳光)和物体表面的反射通常是连续且平滑的。例如,同一物体表面的相邻区域在光照下会表现出相似的颜色变化,导致R、G、B通道的强度变化趋势一致。因此在一块区域内通道差值通常较为恒定。基于这一思想,在建立起水平与垂直差值表后,我们假设对于某个像素:
h h h 是水平方向的估计,误差为 ϵ h ϵ_h ϵh, 方差 σ h 2 σ^2_h σh2
v v v 是垂直方向的估计,误差为 ϵ v ϵ_v ϵv, 方差 σ v 2 σ^2_v σv2
真实信号是 u u u ,满足:
h = u + ϵ h v = u + ϵ v h = u + ϵ_h \\ v = u + ϵ_v h=u+ϵhv=u+ϵv

那么,面对这两个估计值,我们需要找到一个合理的权重,将这两个估值融合在一起以后使其最接近真实值。
我们假设权重是 λ λ λ, 那么有很容易得出
w = ( 1 − λ ) h + λ v w = (1-λ)h + λv w=(1λ)h+λv
w w w是融合后的值,那么我们的目标就变成找到权重 λ λ λ使得 w w w的均方误差(MSE)最小。这一可以使估计值最接近真实值。计算过程如下:
w − u = ( 1 − λ ) ϵ h + λ ϵ v ( w − u ) 2 = ( ( 1 − λ ) ϵ h + λ ϵ v ) 2 M S E = E [ ( w − u ) 2 ] = E [ ( ( 1 − λ ) ϵ h + λ ϵ v ) 2 ] = 0 ∂ M S E ∂ λ = E [ [ 2 ( 1 − λ ) ϵ h + 2 λ ϵ v ] ( ϵ v − ϵ h ) ] = 0 ∂ M S E ∂ λ = 2 E [ − ( 1 − λ ) ϵ h 2 + λ ϵ v 2 + ( 1 − 2 λ ) ϵ h ϵ v ] = 0 = > λ = ϵ h 2 ϵ h 2 + ϵ v 2 w-u = (1-λ)ϵ_h + λϵ_v \\ (w-u)^2 = ((1-λ)ϵ_h + λϵ_v)^2\\ MSE = E[(w-u)^2] = E[((1-λ)ϵ_h + λϵ_v)^2] = 0 \\ \frac{\partial MSE}{\partial λ} = E[[2(1-\lambda)\epsilon_h+2\lambda\epsilon_v](\epsilon_v-\epsilon_h)] = 0\\ \frac{\partial MSE}{\partial λ} = 2E[-(1-\lambda)\epsilon^2_h+\lambda\epsilon^2_v+(1-2\lambda)\epsilon_h\epsilon_v] = 0 => \lambda = \frac{\epsilon^2_h}{\epsilon^2_h+\epsilon^2_v} wu=(1λ)ϵh+λϵv(wu)2=((1λ)ϵh+λϵv)2MSE=E[(wu)2]=E[((1λ)ϵh+λϵv)2]=0λMSE=E[[2(1λ)ϵh+2λϵv](ϵvϵh)]=0λMSE=2E[(1λ)ϵh2+λϵv2+(12λ)ϵhϵv]=0=>λ=ϵh2+ϵv2ϵh2

论文地址Zhang-Wu Directional LMMSE Image Demosaicking

http://www.xdnf.cn/news/679879.html

相关文章:

  • ns-3仿真_wifi发送链路简单解析
  • IEEE出版|2025年智能制造、机器人与自动化国际学术会议 (IMRA2025)
  • 精准调控:基于 SWMM 动态控制规则的合流制排水系统溢流污染防治技术
  • 开源模型应用落地-模型上下文协议(MCP)-安全认证的创新与实践探索(十)
  • 商城前端监控体系搭建:基于 Sentry + Lighthouse + ELK 的全链路监控实践
  • Unity Sherpa-onnx 笔记
  • Python冲刺10天-如何实现基本的矩阵运算
  • 多线程(1)
  • async和await如何捕获异常
  • 两个线程交替打印1-100
  • UWB:litepoint获取txquality里面的NRMSE
  • CSV数据处理全指南:从基础到实战
  • 第六十八篇 从“超市收银系统崩溃”看JVM性能监控与故障定位实战
  • 递归函数,数学表达式转化成递归函数
  • Spring Boot 深度集成 Ollama 指南:从聊天模型配置到生产级应用开发
  • 【STM32】HAL库 之 CAN 开发指南
  • 常用的数据分布
  • [小白]Docker部署kingbase(人大金仓)数据库[超详细]
  • win11如何重启
  • 算法打卡第八天
  • 工业控制系统的神经网络:TSN交换机是如何改变自动化通信的?
  • Python训练营打卡Day38
  • 【DSP笔记】解锁频率之秘:Z 变换与离散傅里叶变换的深度探索
  • 一些视觉应用中的数学小知识点总结
  • Mate桌面环境系统与终端模拟器参数配置
  • ai客服平台哪家好:AnKo多模型AI聚合时代!
  • Python实现自动物体识别---基于深度学习的AI应用实战
  • 【Git】Commit Hash vs Change-Id
  • 浏览器缓存详细介绍
  • API平台(API网关)的API监控预警机制