openCV 的一些原理说明

本文介绍RGB图像转换为灰度图像的基本原理,包括Matlab中使用的权重公式及其背后的科学依据。此外,还讲解了OpenCV中Mat与IplImage之间的转换方法,以及Raw数据格式的特点和常见类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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




### OpenCV 中畸变校正的原理 #### 畸变模型 OpenCV 校准中的失真校正基于对相机固有参数的估计,特别是镜头失真系数。OpenCV 使用数学模型来描述相机镜头引起的失真效果,主要包括径向和切向失真[^1]。 对于不同的镜头类型,如标准摄像头(cv)和鱼眼镜头(fisheye),其畸变模型存在差异,因此畸变系数也会有所不同,在实际应用中使用的公式也不尽相同。具体细节可参照 OpenCV 官方文档版本 2.0 和 3.0 的说明[^2]。 #### 实现方法 在 OpenCV 中实现畸变校正主要有两种方式: - **`undistort()` 函数** 这是一个便捷的方法,它内部集成了 `initUndistortRectifyMap()` 和 `remap()` 函数的功能,用于矫正输入图像并返回已修正的结果。此过程简化了编程流程,使得开发者无需手动处理映射表创建与重映射操作。 - **`initUndistortRectifyMap()` 结合 `remap()`** 此种做法提供了更灵活的操作选项。先通过调用 `initUndistortRectifyMap()` 来计算新的投影关系,并生成两个映射数组;随后利用这两个数组作为参数传递给 `remap()` 函数完成最终的图像变形调整工作。这种方式允许用户自定义更多的参数设置,适用于复杂场景下的精确控制需求。 ```cpp // C++ 示例代码展示如何使用 initUndistortRectifyMap() 和 remap() #include <opencv2/opencv.hpp> using namespace cv; Mat cameraMatrix, distCoeffs; Mat map1, map2; Size imageSize(Size(640, 480)); // 初始化无畸变映射 void InitUndistortMaps(){ Mat R = getIdentity(); initUndistortRectifyMap(cameraMatrix, distCoeffs, R, cameraMatrix, imageSize, CV_32FC1, map1, map2); } // 应用映射到图片上 void ApplyRemap(Mat& srcImg, Mat& dstImg){ remap(srcImg, dstImg, map1, map2, INTER_LINEAR); } ``` #### 像素损失现象解释 经过畸变校正之后,图像确实会出现一定程度的有效像素丢失情况。这是因为原始带有桶形或其他形式畸变的区域被拉伸展平的过程中不可避免地引入了一些空白区,这些部分无法填充有效的视觉数据而形成黑边或裁剪边缘的现象[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值