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相互转换



Mat 是OpenCV和C++的接口矩阵类,ImlImage是OpenCV和C语言的接口的结构体,但是C++程序有时候时候还是要用到ImlImage,例如在MFC中的Picture Control显示图片。下面总结了针对OpenCV3.0以上版本的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位没用。

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