【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
做过isp的同学都知道,图像处理里面有一个3A,即自动曝光、自动白平衡和自动对焦。其中自动对焦这个,就需要用输入的图像清晰度作为反馈,自动调整摄像头的焦距。这也是摄像头中唯一需要机械控制的部分。那怎么判断图像的清晰度,这里面每个厂家都有自己的算法。今天我们学习的qmacvisual软件里面就自带了三个算法。
1、创建工程、创建流程
工程和流程是qmacvisual软件使用的第一步。
2、导入图像清晰度插件
图像清晰度插件,它的位置位于【检测识别】下面。直接拖过来就可以使用。
整个插件中有两个地方需要配置。第一个是文件夹下面,也就是说需要从文件夹下面挑选出清晰度最高的那张图片。整个文件夹大约100多张图片,如果大家跟进去看的话,就会发现图片是从模糊到清晰、再到模糊的状态。第二个是相关算法的配置,目前有三个算法供选择,分别是Tenengrad算法、Laplacian算法和SMD算法。选择好之后,单击执行按钮,就会看到清晰度最高的那个算法。此外,还可以看出当前图片这个特征的最优值是多少。
3、算法实现原理
实现上面,三个算法我们都可以找到对应的实现代码过程。不失一般性,我们找到其中Laplacian梯度的实现过程,
//使用Laplacian梯度法计算一幅图像的清晰度
double frmImageClarity::CalcClarityLaplacian(const cv::Mat src_mat)
{
try
{
cv::Mat gray;
if (src_mat.channels() == 3)
{
cv::cvtColor(src_mat, gray, cv::COLOR_BGR2GRAY);
}
else if (src_mat.channels() == 4)
{
cv::cvtColor(src_mat, gray, cv::COLOR_RGBA2GRAY);
}
else
{
src_mat.copyTo(gray);
}
cv::Mat imageLaplacian;
cv::Laplacian(gray, imageLaplacian, CV_16U);
//图像的平均灰度
double meanValue = 0.0;
meanValue = cv::mean(imageLaplacian)[0];
return meanValue;
}
catch (...)
{
return -1;
}
}
整个过程实现还是比较简单的,基本就三个步骤,第一步灰度转换;第二步Laplacian转换;第三步求解平均灰度。计算下来,就是哪张图片的灰度最高,就是哪张图片最清晰。有兴趣的同学,可以再去看看其他两种方法的实现过程。对于拍照不是很好,或者有抖动的图片来说,这种方法还是非常实用的。
4、其他两种算法的效果
我们看一下除了Tenengrad算法之外,另外两种算法的执行效果是什么样的。需要注意的是,不同的算法判断标准是不一样的,所以左上角输出的数值可能是不一样的。