openCV 的一些原理说明

1. RGB2GRAY原理

以R、G、B为轴建立空间直角坐标系,则RGB图的每个象素的颜色可以用该三维空间的一个点来表示,
而Gray图的每个象素的颜色可以用直线R=G=B上的一个点来表示。于是rgb转gray图的本质就是寻找
一个三维空间到一维空间的映射,最容易想到的就是射影(即过rgb空间的一个点向直线R=G=B做垂线),
事实上Matlab也是这样做的,并且有Gray = 0.29900 * R + 0.58700 * G + 0.11400 * B。

       灰度可以说是亮度(luminance)的量化值,而RGB的定义是客观的三个波长值,转换时需要考虑人眼对不同波长的灵敏度曲线,所以系数不相等。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

2. Mat和IplImage相互转换

  1. //IplImage—>Mat  
  2. //EXAMPLE:  
  3. //浅拷贝:  
  4. IplImage* pBinary=cvLoadImage("c://temp.jpg",0);  
  5. Mat Img;  
  6. Img=cvarrToMat(pBinary);  
  7. //深拷贝只需要再在Mat里创建一个新的Mat对象,然后进行数据的复制,再用上述的函数进行数据头的复制(浅拷贝):  
  8. IplImage* pBinary=cvLoadImage("c://temp.jpg", 0);  
  9. Mat ImgTemp;  
  10. Img=cvarrToMat(pBinary);  
  11. Mat Img = ImgTemp.clone();  
  12.   
  13.   
  14. //Mat—>IplImage  
  15. //EXAMPLE:  
  16. //浅拷贝:  
  17. Mat Img=imread("1.jpg");  
  18. IplImage* pBinary = &IplImage(Img);  
  19. //深拷贝只要再加一次复制数据:  
  20. IplImage *input = cvCloneImage(pBinary);  
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

3. RAM数据格式解析

Raw格式是sensor的输出格式,是未经处理过的数据,表示sensor接受 到的各种光的强度。
Raw数据在输出的时候是有一定的顺序的,一般为以下四种:
00:  GR/BG
01:   RG/GB
10:  BG/GR
11:   GB/RG

为什么每种情况里有两个G分量呢?这时因为人的眼睛对绿色比较敏感,所以增加了对绿色的采样。其中每个分量代表一个piexl。所以GR/BG就代表四个piexl,在物理sensor上就表示4个晶体管,用一个晶体管只采样一个颜色分量,然后通过插值计算得到每个piexl,这样做的主要目的是降低功耗。
sensor输出的数据一般要送到ISP中处理才会得到一个好的效果,这就需要ISP知道sensor输出的raw数据的顺序与大小,其中顺序一般通过配置ISP的pattern寄存器来实现,大小一般配置在ISP的输入格式控制寄存器中。

下面说以下raw数据几种常用的格式:

RAW8:

Raw8即是用8bits表示G/R/B/G中的一个分量,而不是使用8bits表示RG/GB四个分量。在sensor中,为了降低功耗,使用一个晶体来表示一种颜色,然后利用差值计算出相邻像素的值。

Raw10:

Raw10就是使用10bit表示上述的一个G/R/B/G,但是数据中是16bit的,高6位没用。

Raw12:

Raw12: 就是使用12bit表示上述的一个G/R/B/G,但是数据中是16bit的,高4位没用。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~




猜你喜欢

转载自blog.csdn.net/guosongye/article/details/80274745