Demosaic 和 Remosaic

理论 + 伪代码示例 + 手机影像算法集成场景

一、理论

  1. Demosaic(去拜耳 / 解拜耳)

作用:Bayer RAW → RGB

Sensor输出Bayer阵列,每个像素只采集R/G/B其中一个通道。Demosaic通过邻域插值,给每个像素补齐另外两个缺失的颜色通道,输出每个像素都具备R、G、B三通道的图像。

输入:Bayer RAW(RGGB/BGGR等)

输出:Full RGB图像

位置:ISP Pipeline,RAW降噪之后,RGB域处理之前

插值会引入伪色、拉链效应,是RAW域图像处理的重点难点。

  1. Remosaic(重拜耳)

作用:RGB → Bayer RAW,和Demosaic反向操作。

把已经插值完成的Full RGB图像,按照Bayer CFA排列规则,重新采样回拜耳阵列格式。

输入:Full RGB

输出:Bayer RAW

核心:只保留对应位置的通道,丢弃另外两个通道信息,还原Bayer的像素排布。

注意:Remosaic不是无损还原原始Sensor RAW。原始RAW是Sensor真实光电采样;Remosaic是从插值后的RGB反向采样,会带入Demosaic插值带来的噪声、伪色。

一句话区分

Demosaic:拜耳转RGB(拆)

Remosaic:RGB转回拜耳(拼回去)

二、代码示例(简化伪代码 BGGR)

// BGGR:偶数行 B G B G;奇数行 G R G R

// Demosaic 简化示意(仅逻辑演示,工程是复杂插值算法)

void demosaic(unsigned short* bayer_raw, unsigned short* rgb, int w, int h, int raw_stride)

{

for(int y = 0; y < h; y++)

{

unsigned short* raw_line = bayer_raw + y * raw_stride;

for(int x = 0; x < w; x++)

{

if(y%2 ==0)

{

if(x%2 ==0) {

rgby\*w\*3 + x\*3 +0 = raw_linex; // B

// G/R 通过邻域插值估算

} else {

rgby\*w\*3 + x\*3 +1 = raw_linex; // G

}

}

else

{

if(x%2 ==0) {

rgby\*w\*3 + x\*3 +1 = raw_linex; // G

} else {

rgby\*w\*3 + x\*3 +2 = raw_linex; // R

}

}

}

}

}

// Remosaic:RGB转回BGGR拜耳阵列

void remosaic(unsigned short* rgb, unsigned short* bayer_out, int w, int h, int out_stride)

{

for(int y = 0; y < h; y++)

{

unsigned short* bayer_line = bayer_out + y * out_stride;

for(int x = 0; x < w; x++)

{

int idx = y*w*3 + x*3;

if(y%2 ==0)

{

if(x%2 ==0) bayer_linex = rgbidx+0; // B

else bayer_linex = rgbidx+1; // G

}

else

{

if(x%2 ==0) bayer_linex = rgbidx+1; // G

else bayer_linex = rgbidx+2; // R

}

}

}

}

三、手机影像算法集成实际工作场景

Demosaic(日常高频)

ISP标准模块,RAW降噪之后执行,把Bayer RAW转为RGB,后续CCM、Gamma、锐化都在RGB域处理。

调试痛点:

弱光高增益下,Demosaic容易产生伪色(false color)、边缘拉链效应;

Demosaic算法有多种:双线性、VNG、自适应插值,不同算法效果和算力开销不同。

Remosaic(不是ISP原生模块,算法外挂场景才会用到)

什么时候需要Remosaic?

核心场景:在RGB域做处理,但是后续ISP链路仍然需要Bayer格式输入

举例:

多帧HDR融合:多帧RAW做Demosaic融合,融合完得到RGB图;但平台ISP只能接收Bayer RAW做后续处理,需要Remosaic转回Bayer再送入ISP。

外挂软件降噪:RGB域降噪处理完成,需要把图像重新打包回拜耳格式,送回硬件ISP继续跑后面流水线。

⚠️ Remosaic的工程坑(面试高频)

信息不可逆损失:Demosaic插值出来的RGB本身就有估算值,remosaic之后的Bayer,不等于Sensor原始RAW。不能拿remosaic结果当成原生RAW,黑电平、噪声特性会变化。

Bayer Pattern必须严格匹配:Remosaic输出的CFA排列,要和下游ISP配置完全一致(BGGR/RGGB),否则颜色错乱。

算力开销:Demosaic+Remosaic成对使用,两次图像转换,会增加功耗与内存占用,移动端影像尽量避免不必要的来回转换。

工程准则:能直接在Bayer域处理,就不要Demosaic+Remosaic来回转换,减少画质损失和性能开销。

✅ 精简版

Demosaic是将Sensor Bayer RAW插值转换成完整RGB图像,放在ISP RAW降噪之后;Remosaic是反向操作,把RGB图像按CFA规则重新采样生成Bayer阵列。

Demosaic是ISP标准流程;Remosaic多用于软件算法在RGB域处理后,需要重新送回Bayer输入的硬件ISP场景。

要注意,Remosaic生成的拜耳数据不是原始Sensor RAW,存在画质损失;Demosaic+Remosaic来回转换会增加功耗,影像项目尽量避免不必要的互转。

相关推荐
CodeYp20193 小时前
第19讲:封装红黑树实现 mymap 和 myset
开发语言·c++·红黑树
孙鹏宇.4 小时前
C++类型转换
c++
超级架构师4 小时前
让 COBOL 长出 AI 大脑:原生 Agent 核心框架 praxo-core 深度剖析
c语言·开发语言·c++·人工智能·python·架构·ai编程
·present·4 小时前
CSAPP(lecture 10)
c语言·c++
YLCHUP4 小时前
【模拟&STL】题解:AT_abc203_e [ABC203E] White Pawn_基础算法_数据结构_STL模板库_AtcoderABC_C++算法竞赛
数据结构·c++·算法·leetcode·动态规划·哈希算法·近邻算法
xiaolang_8616_wjl4 小时前
c++游戏_宝可梦大世界(源代码)
开发语言·c++·游戏
余额瞒着我当琳5 小时前
C++异常,异常的概念,异常抛出与捕获,RAII 和智能指针的设计思路,C++标准库一些指针的使用
java·开发语言·c++·算法
東隅已逝,桑榆非晚5 小时前
map和set的使用
数据结构·c++·笔记·学习
骑着蜗牛撵大象3275 小时前
大模型 SDK 编译就崩?用 CMakeLists 把 httplib、JSON 与 OpenSSL 装配成可复用的 ChatServer
android·java·c++·http·json·cmake·大模型sdk