我是靠谱客的博主 柔弱鸵鸟,这篇文章主要介绍3A之自动对焦(AF——Auto Focus)算法,现在分享给大家,希望可以做个参考。

介绍

自动对焦是相机在无参考图像模式下,在拍照时进行对焦控制。其工作模式就是利用图像清晰度的评价指标控制镜头与CCD等感光元件的距离,图像从模糊到清晰,再到模糊,确定清晰度峰值,选定最佳位置。

清晰度评价标准

1. Tenegrad函数

图像处理中一般认为对焦好的图像具有更尖锐的边缘,因此具有更大的梯度函数值。

Tenegrad函数利用sobel算子提取图像水平和垂直方向梯度信息:

计算Tenegrad值为:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
double Tenegrad(Mat src) { Mat xgrad, ygrad; Mat img_grad; cvtColor(src, img_grad, CV_BGR2GRAY); Sobel(img_grad, xgrad, CV_32F, 1, 0); Sobel(img_grad, ygrad, CV_32F, 0, 1); Mat Sxy; sqrt((xgrad.mul(xgrad) + ygrad.mul(ygrad)), Sxy); pow(Sxy, 2, Sxy); double outvalue = mean(Sxy)[0]; return outvalue; }

依次输入图片如下:

 

 凭人眼观察越来越不清晰,计算Tenegrad值如下:

与人眼观察一致。 

2.  方差函数

准焦的清晰图像具有更大的灰度级差异,通过计算图像的方差或标准差构建对焦评价函数来评价图像的清晰度。

meanStdDev返回mean和std的channel*1的矩阵,分别是每个通道的均值和标准差。

复制代码
1
2
3
4
5
6
7
8
double fangcha(Mat src) { Mat grad; cvtColor(src, grad, CV_BGR2GRAY); Mat mean_, std_; meanStdDev(grad, mean_, std_); double outvalue = std_.at<double>(0, 0); return outvalue; }

 依旧为以上四张图,方差和人眼观察一致。

3. 能量梯度函数

利用相邻点的差分计算点的梯度:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
double EOG(Mat src) { Mat gray; cvtColor(src, gray, CV_BGR2GRAY); Mat kernely = (Mat_<char>(2, 1) << -1, 1); Mat kernelx = (Mat_<char>(1, 2) << -1, 1); Mat engx, engy; filter2D(gray, engx, CV_32F, kernelx); filter2D(gray, engy, CV_32F, kernely); Mat result = engx.mul(engx) + engy.mul(engy); double outvalue = mean(result)[0]; return outvalue; }

 依旧为以上四张图,能量函数和人眼观察一致。

4. BBrenner函数

就是能量梯度函数单个方向的版本。

5. 拉普拉斯函数

利用拉普拉斯算子:

 得到梯度矩阵,评价函数为该梯度矩阵的平方和。

  依旧为以上四张图,拉普拉斯评价函数和人眼观察一致。

最后

以上就是柔弱鸵鸟最近收集整理的关于3A之自动对焦(AF——Auto Focus)算法的全部内容,更多相关3A之自动对焦(AF——Auto内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(76)

评论列表共有 0 条评论

立即
投稿
返回
顶部