Demsaic 系列一:简单插值法
从今天起,开始总结去马赛克的算法。去马赛克是 ISP 流程中最为重要、最为热门的几个模块之一,这几个月的重点也一直在这方面。下面对所看的内容进行记录。
双线性插值
太简单了,就是从上下左右取值。如果上下没有,就只算左右;反之亦然。
色差法
引入了一个很重要的原理:一个完整的 RGB 三通道图像中,两个相邻像素间对应通道的像素差近似相等。即加入 P1 和 P2 是相邻像素,可以认为:
- 先用普通的双线性插值预测 G:G=¼*(G1+G2+G3+G4)
![]() |
![]() |
|---|---|
- 在 R 中补充 B、在 B 中补充 R:
![]() |
\(\displaystyle \mathrm{P}_c\left( \mathrm{G} \right) -\mathrm{P}_c\left( \mathrm{R} \right) =\frac{1}{4}\,\,* \sum_{\mathrm{n}=1}^4{\mathrm{P}_n\left( \mathrm{G} \right) -\mathrm{P}_n\left( \mathrm{R} \right)}\) Pc(G) 已知,可求出 Pc(R) |
|---|---|
- 在 G 中补充 R
![]() |
\(\displaystyle \mathrm{P}_c\left( \mathrm{G} \right) -\mathrm{P}_c\left( \mathrm{R} \right) =\left[ \left( \mathrm{P}_1\left( \mathrm{G} \right) -\mathrm{P}_1\left( \mathrm{R} \right) \right) +\left( \mathrm{P}_2\left( \mathrm{G} \right) -\mathrm{P}_2\left( \mathrm{R} \right) \right) \right] \div 2\) Pc(G) 已知,可求出 Pc(R) |
|---|---|
HA 算法
引入了另一个重要思想:利用梯度判断边缘。梯度小的地方被认为是纹理方向,因此使用这个方向的色差进行插值。
这个方法还有一个前提,属于是色差相似的扩展:一个小范围内的点与小范围平均下来的值也满足条件。
- 预测 G(色差法是根据双线性插值预测):通过梯度来判断预测。计算出横向竖向梯度,然后比较大小,根据小的梯度的方向进行插值。
| R/B 预测 G | R 预测 B |
|---|---|
![]() |
![]() |
- R 中预测 B:基本和上一步一样,只不过是从对角线出发,利用上一步补充的 G,查看梯度,然后计算(最终插值结果也是通过原理给的色差相近计算而来,只不过变成沿着对角线的 1*5 数据):
- G 中补充 R:这一步就不用管太多了,直接计算。两种情况,G 左右都是 R,左右都是 B。如果左右都是 R:那就利用原理给的 1*5 的横向矩阵,计算得出 R 值,就是最终的 R 值,然后再利用 1x5 的纵向矩阵,计算 B 值。左右都是 B 同理。
PS:这一步感觉还是随意了,因为边界处还是不太遵守这个理论。因此在边界处使用这个,可能还是会有问题。
Malvar-He 算法
一篇简单,但是绝对很有用的文章,我一开始也是觉得就这啊,为啥斯坦福大学的课会强调这个方法呢,直到自己设计的时候,面对 FPGA 工程师反复强调的节约资源要求,我才发现:嗯,线性插值,真香!
方法很简单,就是用色差法,直接看下面一段话:

其他颜色也是同理,只不过系数分别是 beta 和 gamma。之后通过一系列图片进行训练,求出 alpha 取什么值,均值最小;beta 和 gamma 同理。
最后作者为了加快速度,还把这三个变量修改一下,这样速度快一点。结果分别是 ½、⅝、¾,最终带回到公式,比如 alpha=½ 就是代入公式 2 中,得出预测 G 值,周围像素的权重,速度非常非常快:
个人感觉有以下几点可以修改:
-
修改成类似 ⅜ 这种很完美的数字可以根据 FPGA 的情况进一步逼近,比如算出原始权重是 0.38,乘以一个 4096,得到 1556,即 1556/4096,这个比 ⅜ 更好,看 FPGA 的资源情况吧。
-
可以一窝蜂的直接用 5*5 的窗口去算各个周围的权重,即不像上图 5*5 的像素中有些是 0,而是直接 5*5 即 25 个像素打入到全连接网络算就完事了。





