简介

Bayer型CFA上面每一个感光点仅允许一种颜色分量通过,所以其整帧画面是由单通道RGB颜色组成的灰度图。其可按照BGGR,RGGB,GBRG,GRBG四种排列方式给出。若想获得全彩的图像,必须估计出每一个像素点的其他两个像素灰度值。以图1所示,图中B33

图1 B点的5×5邻域

点采集到的只有蓝色灰度值,这就需要估计出B33处的R和G灰度值,如此方可将Bayer型数据转换为RGB3通道数据。我们称这个过程为Bayer型颜色滤波阵列的插值过程,又名去马赛克(Demosaicing)。

2. 算法描述

关于颜色插值算法有很多,包括传统上的最近邻域插值法,双线性插值法(Bilinear)[1],这些算法在颜色比较平坦的区域得到了很好的插值效果,但对于一些边缘部分(高频部分)的处理效果明显存在缺陷,导致整幅图像看上去变得模糊了。近年来出现了Laplacian, Freeman, Hamilton-Adams,Pei-Tam,Kimmel,AP,ECI等算法。它们不但能很好地平滑平坦区域,也引入了边缘信息进行计算,利用了空间信息,还利用了色差与亮度之间的相关性,使得在一定程度上较好地保留了边缘信息,总体效果明显好于传统算法。但是其中也有一部分算法比较复杂,不易于在FPGA等VLSI上实现,包括浮点运算,权重相乘,除法运算等。经过研究,最后基本确定了基于G-B,G-R空间的颜色插值算法[2]。下面基于Matlab的实现方式对算法原理进行描述。

首先对于CFA型图像上的一点,定义以下颜色空间:

步骤一:先计算G点的Kr和Kb值

for i=3:m-2

for j=3:n-2

if(rem(i,2)~=0)

if(rem(j,2)~=0)

%B点计算周围4个G点Kb的值

Kb(i-1,j)=I(i-1,j)-(I(i-2,j)+I(i,j))/2;

Kb(i,j-1)=I(i,j-1)-(I(i,j-2)+I(i,j))/2;

Kb(i,j+1)=I(i,j+1)-(I(i,j+2)+I(i,j))/2;

Kb(i+1,j)=I(i+1,j)-(I(i+2,j)+I(i,j))/2;

end

else

if(rem(j,2)==0)

%R点计算周围4个G点Kr的值

Kr(i-1,j)=I(i-1,j)-(I(i-2,j)+I(i,j))/2;

Kr(i,j-1)=I(i,j-1)-(I(i,j-2)+I(i,j))/2;

Kr(i,j+1)=I(i,j+1)-(I(i,j+2)+I(i,j))/2;

Kr(i+1,j)=I(i+1,j)-(I(i+2,j)+I(i,j))/2;

end

end

end

end

步骤二:计算所有G值

for i=3:m-2

for j=3:n-2

if(rem(i,2)~=0)

if(rem(j,2)~=0)

%B点根据周围4个G点Kb值计算G值

J(i,j,2)=I(i,j)+(Kb(i-1,j)+Kb(i,j-1)+Kb(i,j+1)+Kb(i+1,j))/4;

else

J(i,j,2)=I(i,j);

end

else

if(rem(j,2)==0)

%R点根据周围4个G点Kr值计算G值

J(i,j,2)=I(i,j)+(Kr(i-1,j)+Kr(i,j-1)+Kr(i,j+1)+Kr(i+1,j))/4;

else

J(i,j,2)=I(i,j);

end

end

end

end

步骤三:再计算R,B点的Kb和Kr值

for i=3:m-2

for j=3:n-2

if(rem(i,2)~=0)

if(rem(j,2)~=0)

%B点

Kb(i,j)=J(i,j,2)-I(i,j);

end

else

if(rem(j,2)==0)

%B点

Kr(i,j)=J(i,j,2)-I(i,j);

end

end

end

end

步骤四:再计算G点的R值和B值

for i=3:m-2

for j=3:n-2

if(rem(i,2)~=0)

if(rem(j,2)==0)

%G点计算B的值

J(i,j,3)=J(i,j,2)-(Kb(i,j-1)+Kb(i,j+1))/2;

%G点计算R的值

J(i,j,1)=J(i,j,2)-(Kr(i-1,j)+Kr(i+1,j))/2;

end

else

if(rem(j,2)~=0)

%G点计算B的值

J(i,j,3)=J(i,j,2)-(Kb(i-1,j)+Kb(i+1,j))/2;

%G点计算R的值

J(i,j,1)=J(i,j,2)-(Kr(i,j-1)+Kr(i,j+1))/2;

end

end

end

end

步骤五:最后计算B点的R值和R点的B值

for i=3:m-2

for j=3:n-2

if(rem(i,2)~=0)

if(rem(j,2)~=0)

%B点计算R的值

J(i,j,1)=J(i,j,2)-(Kr(i-1,j-1)+Kr(i-1,j+1)+Kr(i+1,j-1)+Kr(i+1,j+1))/4;

%B点计算B的值

J(i,j,3)=I(i,j);

end

else

if(rem(j,2)==0)

%R点计算B的值

J(i,j,3)=J(i,j,2)-(Kb(i-1,j-1)+Kb(i-1,j+1)+Kb(i+1,j-1)+Kb(i+1,j+1))/4;

%B点计算B的值

J(i,j,1)=I(i,j);

end

end

end

end

3. 实验结果

以图2为例,显示了该算法在Matlab上插值的结果,其中图2(a-b)为模拟的原始CFA格式图,图2(c-d)为插值后的对应图片,图2(e-f)为原始标准RGB图[3]。

图2(a) 05.png

图2(b) 08.png

图2(c) 05.png

图2(d) 08.png

图2(e) 05.png

图2(f) 08.png

当然,主观上看,恢复出的图片c,d与原始图像e,f几乎无区别,但如图中所示,仍然有一些细节可以辨别出。为了更加容易评价算法的性能,我们可以引入信噪比率指标:

为此,我们可将各算法比较如下表所示。其中,SCEE算法是在SC算法上引入Laplacian边缘算法的一种结合算法,ASIC为一家在FPGA上开发ISP厂家的算法指标[4]。

Image

Fiture

Bilinear

Laplacian

SC

SCEE

ASIC?

1

25.35

29.48

24.90

30.02

34.84

30.02

33.10

35.68

33.40

34.18

36.28

34.63

34.78

36.50

34.96

2

31.43

36.32

32.33

33.31

41.01

34.93

35.07

41.47

39.71

35.81

42.19

40.81

40.18

41.94

40.59

3

33.42

37.06

33.19

34.68

42.31

35.31

39.46

42.84

40.95

40.17

43.44

41.69

39.92

43.70

41.99

4

32.56

36.51

32.90

33.97

40.67

34.42

37.52

41.80

40.61

37.90

41.96

40.88

40.83

42.09

38.29

5

25.87

29.21

25.54

30.62

35.98

30.67

34.39

36.81

35.48

35.12

37.32

36.25

34.87

37.73

36.92

6

26.55

30.95

26.32

31.16

36.14

30.98

34.25

36.90

34.14

35.59

37.66

35.51

35.01

37.52

35.74

7

32.64

36.23

32.42

34.65

42.20

34.92

39.27

41.94

40.90

40.10

42.93

42.13

40.28

43.78

42.94

8

22.58

27.34

22.31

28.28

33.56

28.14

29.86

33.15

30.03

31.96

34.68

32.30

32.49

35.11

33.28

9

31.42

35.65

31.53

34.42

41.57

34.15

39.09

41.47

38.69

40.64

42.61

40.03

41.41

42.88

40.40

10

31.55

35.29

31.24

34.29

41.38

33.87

39.65

42.09

39.20

40.50

42.77

40.04

40.85

43.24

40.47

11

28.13

32.25

28.19

31.75

37.33

32.10

35.07

38.17

36.33

36.01

38.74

37.50

36.97

38.70

37.37

12

32.29

36.33

31.48

34.64

42.43

34.15

38.47

42.14

39.23

39.91

43.42

41.04

40.38

43.50

41.34

13

23.12

26.42

22.78

27.30

30.75

26.94

31.20

32.64

30.87

31.24

32.38

30.92

30.54

32.41

31.38

14

27.95

32.05

28.36

31.07

37.38

32.68

33.35

37.95

36.63

34.00

38.60

37.50

34.99

38.62

37.50

15

30.87

34.72

30.13

32.52

39.56

33.98

35.08

40.35

38.07

35.78

40.87

39.04

38.82

40.71

38.97

16

30.17

34.71

30.22

33.37

39.72

34.23

37.13

39.97

37.44

38.78

41.05

39.11

38.35

40.89

38.79

17

31.24

34.57

31.07

33.68

39.53

33.95

39.38

40.56

38.34

39.90

40.80

38.74

39.14

40.83

39.85

18

27.28

30.51

26.88

31.17

34.81

30.92

35.04

36.53

33.88

35.07

36.31

33.89

35.08

36.60

35.15

19

26.84

31.74

27.14

32.32

38.40

32.92

34.72

37.29

34.61

37.06

39.15

36.97

38.27

39.83

37.66

20

30.72

34.39

30.50

35.77

39.78

34.36

38.44

40.52

37.48

39.36

41.08

38.33

37.97

41.62

40.68

21

27.47

31.58

27.48

31.91

36.47

31.57

35.19

37.61

35.29

36.01

37.95

36.12

35.68

38.15

36.86

22

29.78

33.45

29.29

33.27

37.93

33.18

36.11

38.58

36.00

36.58

39.10

36.94

36.25

39.30

37.69

23

34.53

38.12

34.28

35.51

43.36

37.35

39.66

43.54

39.41

40.25

44.18

40.07

40.92

44.21

43.50

24

26.37

29.44

25.13

30.56

33.42

28.70

34.03

35.56

32.07

33.74

35.10

31.87

31.72

35.18

34.25

Average

29.17

33.10

28.98

32.51

38.36

32.69

36.02

38.98

36.61

36.90

39.61

37.60

37.32

39.79

38.19

4. FPGA插值算法设计

图3:Color Filter Array Interpolation Block Diagram

如图3所示,算法中需要5个模块,其中第一个模块需要存储4行单通道数据,以使其输出构建成5×5矩阵。第二个模块实现G分量的插值,第三个模块实现输出3×3输出,以方便在第4个模块中实现Kb,Kr的插值,最后输出RGB分量。

采用FPGA进行bayer插值算法的实现方法相关推荐

  1. 一种基于FPGA硬件求解对数的简化方法

    本文研究了一种运用FPGA进行数据处理的方法,包括:提取输入数据的高log2M个比特位的数据,作为高有效位,根据预先设置的目标函数的计算表格,查找所述高有效位对应的目标函数值y(n)以及高有效位+1对 ...

  2. 【FPGA】时钟信号几种设计方法

    最近找工作,课题组报告一堆事搞得不可开交,今天就再更一下时钟信号的几种设计方法吧,哇好气,今天发现这个破编辑器好烦,都快写完了,都有给我搞丢了,还得重新写!吐槽一下CSDN的博客编辑,希望不要再出现这 ...

  3. bayer插值算法(1):邻近插值算法

    目录 前言 插值算法 Bayer阵列类别 邻近插值算法 代码示例 前言 相机生成的图像一般是bayer阵列的raw图,这时候如果转换成我们需要的rgb图像,就需要对应的bayer插值算法将丢失的rgb ...

  4. 采用FPGA实现音频模数转换器

    摘 要 简要分析sigma-deIta(∑一△)架构模数转换器(ADC)原理,提出一种基于FPGA内部LVDS(Low Voltage Differential Signaling)接收器的音频ADC ...

  5. 采用FPGA IP实现DDR的读写控制的设计与验证

    随着高速处理器的不断发展,嵌入式系统应用的领域越来越广泛,数字信号处理的规模也越来越大,系统中RAM规模不断增加,比如视频监控.图像数据采集等领域,图像处理的实时性对RAM带宽的要求不断增加,传统的S ...

  6. bayer插值算法(3):高质量线性插值算法

    目录 前言 插值算法 高质量插值算法 代码示例 前言 相机生成的图像一般是bayer阵列的raw图,这时候如果转换成我们需要的rgb图像,就需要对应的bayer插值算法将丢失的rgb信息通过算法补齐 ...

  7. (21)FPGA面试题D触发器表示方法

    1.1 FPGA面试题D触发器表示方法 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题D触发器表示方法: 5)结束语. 1.1.2 本节引言 " ...

  8. 【软件项目管理】用例分析方法采用一种面向对象的情景分析方法

    用例分析方法采用一种面向对象的情景分析方法. 传统的结构化分析方法是面向功能的,而面向对象的视点是将系统看作一组服务,将问题看作相互作用的实体.用例分析方法采用面向对象的方法,将现实世界的" ...

  9. quartus管脚分配后需要保存吗_Quartus II中FPGA的管脚分配保存方法

    一.摘要 将Quartus II中FPGA管脚的分配及保存方法做一个汇总. 二.管脚分配方法 FPGA 的管脚分配,除了在QII软件中,选择"Assignments ->Pin&quo ...

最新文章

  1. 特殊SQL语句及优化原则
  2. C语言 —— 把字符指针中的字符串,存入字符数组中
  3. php三位不够前面加0,php 格式化数字 位数不足前面加0补足的实现方法
  4. JQUERY的split
  5. hashCode()方法的性能优化
  6. DOM-12 【模拟桌面待讲评】鼠标事件深入、点击与拖拽分离、双击事件
  7. 【渝粤教育】广东开放大学 综合英语1 形成性考核 (36)
  8. Android 10分钟集成极光推送
  9. yii2 migrate 数据库迁移的简单分享
  10. spring框架 web开发_go语言web开发框架学习:Iris框架讲解(一)
  11. 新来个专家吐槽我们:连qps都不懂,靠谱吗?
  12. android获取设备的唯一编号,android如何获取设备的唯一设备码
  13. TypeScript入门教程 之 类/抽象类/构造器/Getter/Setter
  14. python的深拷贝和浅拷贝
  15. linux 自动获取ip和dns,linux 配置IP和DNS
  16. springboot动态切换数据源_Springboot整合Mybatis注解实现动态数据源切换
  17. Pycharm 远程连接服务器(ssh)运行深度学习代码 | 详细步骤
  18. PPT学习整理(四)表格
  19. 彼得林奇——如何看待股市大跌
  20. 什么是Python?Python简介

热门文章

  1. echart动态切换图表类型
  2. 通过C3实现基础动画效果
  3. 【android】如何对apk重新进行签名
  4. postsql和geoserver进行连接,并发布服务
  5. curl 使用隧道代理
  6. 康奈尔大学计算机科学研究生,康奈尔大学计算机科学研究生怎么样?好不好
  7. 当湿度达到70蜂鸣器警报
  8. 解决Docker镜像拉取失败问题
  9. 安全测试工具之Hping3
  10. 华为ensp Telnet配置