<平场校正>方法原理分析

1. 平场校正参考资料

Flat-field correction

https://blog.csdn.net/liubing8609/article/details/42386747

https://blog.csdn.net/naozhuo0615/article/details/82894706   平场校正方法

https://blog.csdn.net/eric_e/article/details/82988981        平场校正算法原理

https://www.docin.com/p-1720512105.html   面阵CCD响应

 

2. FFC分析

实际相机采集图像,其图像中各像素的值往往会有较大差异,一般是由以下几个原因造成:

(1)光照不均匀

(2)镜片中心和镜片边缘的响应不一致

(3)成像器件各像元响应不一致(光敏元自身的非均匀性工艺)

(4)固定的图像背景噪声等等.

所谓的平场校正就是校正传感器芯片上这些不一致性.

       通常对于单个像元,其响应灰度值与入射光强度程线性关系.但由于上面所讲的原因,传感器上不同像元对入射光的响应是不同的直线,他们起点不同,斜率也会有差别.平场校正就是通过改变每个像元响应直线的斜率(即信号增益Gain)和偏移(即信号偏移量Offset),使所有像素点的响应 直线相同.

       最常用的平场校正方法是”两点校正法”,该方法的前提就是探测器像元为线性响应.首先相机对暗场进行一次曝光,得到每个像元的偏移(Offset);接下来对均匀光照条件下的灰度均匀物体进行一次成像,得到均匀场图像,最好能够使图像中所有的点都接近最大的灰度值;最后用均匀光场图像减去暗场图像,用相对标定的方法对图像增益(Gain)进行校

 

主要校正介绍:

1)Fixed Pattern Noise (FPN): 暗场,固定图像噪声校正

2)Photo Response Non Uniformity (PRNU):明场,图像非均匀性响应校正

3)Lens and light source non-uniformity:明场,镜头与光源非均匀性校正

* FPN校正时,像素值必须在1DN与127DN(可理解为灰度值)之间;PRNU校正时,像素值必须在128DN与254DN之间。校正前最好首先使用“gl”命令确认DN值是否满足要求

3.校正方法公式

①相机线性响应过程中使用

 

暗场校正(FPN)

a)首先要获取系统的暗场像素值(取平均值);获得该值的目的在于得到CCD在特定的环境下(光亮、温度、时间相同)产生的暗像素值的大小,用一下公式表示

         Goff是图像的偏置量,一般为一常量,i(x,y)为探测器在相应工作条件下的暗电流,以像元考虑的话,单位可以用电子数/秒 像元来表示;t为获取一幅图像的时间;K为转换关系,相应的单位可以用图像灰度/电子数表示

 

明场校正(PRNU)

b)通过对均匀光场的成像以获得一幅用于平场校正的参考图像GR(x,y),该图像原则上要求用均匀光场X0进行照明且时间与暗本底图像GB(x,y)相同,并且照明光场光照水平尽量接近饱和照明条件,参考图像GR(x,y)可表示为

C)被用于校正的图像G(x,y)表示为

当系统是线性响应的时候(η(x,y)是一常量),由式(4)减去式(3)

       这样就获得了经过平场校正后的图像,式(5)表示的是一幅相对值图像.由于X0是均匀的,在式(5)中乘以一个合理的数据(可根据经验)就可以得到一幅灰度适中的图像,并不会对图像处理产生不良影响.

       该类平场校正方法一般运用于线阵CCD相机,对于其他的相机,有其他的处理方法;该算法有一定的局限性,受环境温度、光线的影响比较大,因此要求在工作环境变换不大的情况下才能最大的发挥出算法的效果,一旦工作环境发生较大的变化时,需要重新做平场校正;

 

③面阵CCD非均匀性校正计算方式

       根据面阵CCD的响应特性,校正采用单点、亮点和多点校正方法,单点校正法只是当积分球在一种辐照度输出时将不同像元输出信号矫正成平均信号,具有一定局限性,当面阵CCD响应度为线性时采用两点校正法;若面阵CCD响应为非线性时采用多点定标分段校正,将定标区间分成多段,在每个段内将面阵CCD的非线性响应当作线性响应处理,但随定标点越多,计算的数据量越大。

两点校正法

       面阵CCD每个像元灵敏度响应及暗电流都不可能完全相同,为和定标时面阵CCD响应度表达式区分,这里把每个像元的灵敏度响应及暗电流描述成增益和偏移量,可建立模型:

?(?)表示在辐照度为?时面阵CCD所有像元的平均灰度值,?(?)??表示未经校正的图像第i行第j列像元的实际输出灰度值,???为对应像素位置的像元增益,???为对应像素位置的像元偏移量,M,N分别为图像行列。两点校正方法需要选取两个定标点,由此可推出CCD各像元的增益和偏移量,

由此可推出CCD各像元的增益和偏移量,

4.均匀性评估

       将平场校正前后该处的光强分别读出,比较平场校正前后图像的均匀性。图像的均匀性以图像的灰度值的峰谷值(dpv归一化后的)和标准差S表示。

### 使用 OpenCV 实现平场校正 #### 准备工作 为了实现平场校正,首先需要获取暗场图和平场图。暗场图是在无光照条件下拍摄的图像,而平场图则是在均匀照明条件下拍摄的标准图像。 ```cpp // 加载原始图像、暗场图和平场图 cv::Mat rawImage = cv::imread("raw_image.png", cv::IMREAD_GRAYSCALE); cv::Mat darkField = cv::imread("dark_field.png", cv::IMREAD_GRAYSCALE); cv::Mat flatField = cv::imread("flat_field.png", cv::IMREAD_GRAYSCALE); if(rawImage.empty() || darkField.empty() || flatField.empty()){ std::cerr << "Could not open or find the images!" << std::endl; exit(-1); } ``` #### 数据预处理 接着对这些图像数据做一些必要的预处理操作,比如调整大小使它们尺寸一致等。 ```cpp // 调整所有输入图片至相同大小 cv::resize(darkField, darkField, rawImage.size()); cv::resize(flatField, flatField, rawImage.size()); // 防止除零错误,给分母加一个小常数 double epsilon = 1e-6; flatField.convertTo(flatField, CV_32F); // 转换为浮点型以便后续计算 darkField.convertTo(darkField, CV_32F); ``` #### 应用平场校正算法 按照公式 `(I - D) / (F - D)` 来执行实际的校正过程,其中 `I` 表示待校正的原始图像,`D` 是暗场图,`F` 则代表平场图。 ```cpp // 创建用于存储结果的新矩阵 cv::Mat corrected; // 进行平场校正运算 cv::divide((rawImage - darkField).convertTo(CV_32F), (flatField - darkField + epsilon).convertTo(CV_32F), corrected); // 归一化输出范围到 [0, 255] corrected = cv::normalize(corrected, 0, 255, NORM_MINMAX); corrected.convertTo(corrected, CV_8U); // 转回8位无符号整形 ``` #### 显示与保存结果 最后一步就是展示经过校正后的图像,并将其另存为新文件。 ```cpp // 展示原图和校正后对比效果 cv::imshow("Original Image", rawImage); cv::imshow("Corrected Image", corrected); cv::waitKey(0); // 保存最终得到的结果 cv::imwrite("output_corrected_image.png", corrected); ``` 通过上述代码片段展示了如何基于OpenCV库来完成基本的平场校正流程[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值