图像中的3A控制是指自动曝光控制(AE)、自动聚焦控制(AF)、自动白平衡控制(AWB)。自动曝光控制能够自动调节图像的明暗度,自动聚焦控制能够自动调节图像的焦距,自动白平衡能够使得图像成像在经典光源下的颜色.
自动聚焦(Automatic Focus):
自动聚焦的方法可以按下图分类:
( 1 )红外线测距法的原理是由照相机主动发射红外线作为测距光源 ,并由红外发光二极管间构成的几何关系计算出对焦距离。
( 2 )超声波测距法是根据超声波在相机和被摄物之间传播的时间进行测距的。相机上分别装有超声波的发射和接收装置,工作时由超声振动发生器发出持续超声波。超声波到达被摄体后立即返回被接收器感知,然后由集成电路根据超声波的往返时间来计算确定对焦距离。
自动聚焦的过程就是对成像清晰度评价的过程:对焦不准确则拍摄出来的图像清晰度低;对焦准确则图像清晰度较高,对比度高。
图像清晰度评价算法有多种:空域中,主要是考察图像的邻域对比度,即相邻像素的灰度梯度差;频域中,主要是考察图像的频率分量,对焦清晰的图像高频分量较多。清晰度评价方法包括Tenengrad梯度法、Laplacian梯度法、方差法和能量熵等方法,其中Tenengrad梯度法可以用sober算子近似代替;方差大表示一组数据之间的偏差就大,对焦清晰的图像相比对焦模糊的图像数据之间的灰度差异应该更大,即方差较大,可以通过图像灰度数据的方差来衡量图像的清晰度,方差越大,表示清晰度越好。
Mat imageSource = imread("...");
Mat imageGrey;
cvtColor(imageSource, imageGrey, CV_RGB2GRAY);
Mat imageSobel;
Sobel(imageGrey, imageSobel, CV_16U, 1, 1); //Sobel换为Laplacian,即为Laplacian梯度值
//meanValue近似代替Tenengrad梯度值
double meanValue = 0.0;
meanValue = mean(imageSobel)[0];
- 《基于全自动控制显微镜的自动聚焦算法研究》[J]
- 《自动聚焦原理及方法》[J]
- http://blog.csdn.net/dcrmg/article/details/53543341
自动曝光(Automatic Exposure):
影响图像亮度的因素有: 场景照度、摄像机光圈大小、曝光时间和增益。在场景照度确定的情况下,可以调节后三个参数来改变图像的亮度。光圈调节较慢, 曝光时间的最大值受帧率限制,增加增益值会放大噪声。为了得到正确的曝光量,需要正确的快门与光圈组合。快门快时,光圈要大些;快门慢时,光圈要小些。自动曝光的目的是在不同的照明条件和场景中实现欣赏亮度级别或所谓的目标亮度级别,从而捕获的视频或图像既不太暗也不太亮。为了达到这个目的,要调整镜头孔径,传感器曝光时间,传感器模拟增益和传感器/ ISP数字增益。这个过程称为自动曝光。
- 《一种基于亮度直方图的自动曝光控制方法》
自动白平衡(Automatic White Balance):
白平衡最通俗的理解就是让白色物体所成的像显示为白色,其他景物的影像就会接近人眼的色彩视觉习惯。常用的方法有灰度世界法、完美反射法、自动阈值法等。
(1)灰度世界法(消除RGB受光照影响):
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat g_srcImage,dstImage;
vector<Mat> g_vChannels;
g_srcImage = imread("1.jpg");
imshow("原图",g_srcImage);
//分离通道
split(g_srcImage,g_vChannels);
Mat imageBlueChannel = g_vChannels.at(0);
Mat imageGreenChannel = g_vChannels.at(1);
Mat imageRedChannel = g_vChannels.at(2);
double imageBlueChannelAvg=0;
double imageGreenChannelAvg=0;
double imageRedChannelAvg=0;
//求各通道的平均值
imageBlueChannelAvg = mean(imageBlueChannel)[0];
imageGreenChannelAvg = mean(imageGreenChannel)[0];
imageRedChannelAvg = mean(imageRedChannel)[0];
//求出个通道所占增益
double K = (imageRedChannelAvg+imageGreenChannelAvg+imageRedChannelAvg)/3;
double Kb = K/imageBlueChannelAvg;
double Kg = K/imageGreenChannelAvg;
double Kr = K/imageRedChannelAvg;
//更新白平衡后的各通道BGR值
addWeighted(imageBlueChannel,Kb,0,0,0,imageBlueChannel);
addWeighted(imageGreenChannel,Kg,0,0,0,imageGreenChannel);
addWeighted(imageRedChannel,Kr,0,0,0,imageRedChannel);
merge(g_vChannels,dstImage);//图像各通道合并
imshow("白平衡后图",dstImage);
waitKey(0);
return 0;
}
(2)完美全反射法:
完美全反射理论perfect Reflector假设图像上最亮点就是白点,并以此白点为参考对图像进行自动白平衡,最亮点定义为R+G+B的最大值,具体编码步骤如下:
(1)计算每个像素的R\G\B之和分布,并保存到一临时内存块中。
(2)按R+G+B值的大小计算出其前10%或其他Ratio的白色参考点的的阈值T。
(3)遍历图像中的每个点,计算其中R+G+B值大于T的所有点的R\G\B分量的累积和的平均值。
(4)对每个点将像素量化到[0,255]之间。
- http://blog.csdn.net/app_12062011/article/details/26162791
- http://www.cnblogs.com/ggYYa/p/5707259.html
- http://blog.csdn.net/dcrmg/article/details/53545510
伽马(Gamma)校正:
由于显卡或显示器的原因,实际输出的图像在亮度上会有偏差,而Gamma较正就是通过一定的方法来矫正图像的这种偏差。一般情况下,当用于Gamma较正的值大于1时,图像的高光部分被压缩而暗调部分被扩展;当Gamma较正的值小于1时,图像的高光部分被扩展而暗调部分被压缩。
Opencv测试伽马不同校正值得测试程序:
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
// Normalizes a given image into a value range between 0 and 255.
Mat norm_0_255(const Mat& src) {
// Create and return normalized image:
Mat dst;
switch(src.channels()) {
case 1:
cv::normalize(src, dst, 0, 255, NORM_MINMAX, CV_8UC1);
break;
case 3:
cv::normalize(src, dst, 0, 255, NORM_MINMAX, CV_8UC3);
break;
default:
src.copyTo(dst);
break;
}
return dst;
}
int main(int argc, const char *argv[]) {
Mat image = imread("...");
Mat X;
image.convertTo(X, CV_32FC1);
Mat I;
float gamma = 1/2.2; //伽马可以设置不同值,测试效果
pow(X, gamma, I);
imshow("Original Image", image);
imshow("Gamma correction image", norm_0_255(I));
waitKey(0);
return 0;
}
- http://blog.csdn.net/kaka20080622/article/details/50277477
- http://www.cnblogs.com/whw19818/p/5766038.html