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. 拉普拉斯函数

利用拉普拉斯算子:

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

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

  • 2
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值