采用FPGA进行bayer插值算法的实现方法

简介

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

采用FPGA进行bayer插值算法的实现方法_第1张图片

 图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型图像上的一点,定义以下颜色空间:

采用FPGA进行bayer插值算法的实现方法_第2张图片

        步骤一:先计算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]。

采用FPGA进行bayer插值算法的实现方法_第3张图片图2(a) 05.png

 采用FPGA进行bayer插值算法的实现方法_第4张图片

图2(b) 08.png

采用FPGA进行bayer插值算法的实现方法_第5张图片

 

图2(c) 05.png

采用FPGA进行bayer插值算法的实现方法_第6张图片图2(d) 08.png

 

采用FPGA进行bayer插值算法的实现方法_第7张图片

 

图2(e) 05.png

采用FPGA进行bayer插值算法的实现方法_第8张图片图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插值算法设计

采用FPGA进行bayer插值算法的实现方法_第9张图片

 

图3:Color Filter Array Interpolation Block Diagram

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

你可能感兴趣的:(视觉算法,fpga开发,图像处理,计算机视觉,硬件架构,人工智能)