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位没用。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~