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

概述

介绍

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

清晰度评价标准

1. Tenegrad函数

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

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

计算Tenegrad值为:

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的矩阵,分别是每个通道的均值和标准差。

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. 能量梯度函数

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

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 Focus)算法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部