OpenCV 图像清晰度评价(相机自动对焦)

相机的自动对焦要求相机根据拍摄环境和场景的变化,通过相机内部的微型驱动马达,自动调节相机镜头和CCD之间的距离,保证像平面正好投影到CCD的成像表面上。这时候物体的成像比较清晰,图像细节信息丰富。

相机自动对焦的过程,其实就是对成像清晰度评价的过程,对焦不准确,拍摄出来的图像清晰度低,视觉效果模糊,如果是在工业检测测量领域,对焦不准导致的后果可能是致命的;对焦准确的图像清晰度较高,层次鲜明,对比度高。

图像清晰度评价算法有很多种,在空域中,主要思路是考察图像的领域对比度,即相邻像素间的灰度特征的梯度差;在频域中,主要思路是考察图像的频率分量,对焦清晰的图像高频分量较多,对焦模糊的图像低频分量较多。

这里实现3种清晰度评价方法,分别是Tenengrad梯度方法、Laplacian梯度方法和方差方法。

Tenengrad梯度方法

Tenengrad梯度方法利用Sobel算子分别计算水平和垂直方向的梯度,同一场景下梯度值越高,图像越清晰。以下是具体实现,这里衡量的指标是经过Sobel算子处理后的图像的平均灰度值,值越大,代表图像越清晰。

焦清晰的图像相比对焦模糊的图像,它的数据之间的灰度差异应该更大,即它的方差应该较大,可以通过图像灰度数据的方差来衡量图像的清晰度,方差越大,表示清晰度越好。

 

#include <highgui/highgui.hpp>

  1. #include <imgproc/imgproc.hpp>
  2. using namespace std;
  3. using namespace cv;
  4. int main()
  5. {
  6.     Mat imageSource = imread("2.jpg");
  7.     Mat imageGrey;
  8.     cvtColor(imageSource, imageGrey, CV_RGB2GRAY);
  9.     Mat imageSobel;
  10.     Sobel(imageGrey, imageSobel, CV_16U, 1, 1);
  11.     //图像的平均灰度
  12.     double meanValue = 0.0;
  13.     meanValue = mean(imageSobel)[0];
  14.     //double to string
  15.     stringstream meanValueStream;
  16.     string meanValueString;
  17.     meanValueStream << meanValue;
  18.     meanValueStream >> meanValueString;
  19.     meanValueString = "Articulation(Sobel Method): " + meanValueString;
  20.     putText(imageSource, meanValueString, Point(20, 50), CV_FONT_HERSHEY_COMPLEX, 0.8, Scalar(255, 255, 25), 2);
  21.     imshow("Articulation", imageSource);
  22.     waitKey();
  23. }

方差数值随着清晰度的降低逐渐降低:

UcBoy

发表评论

您必须登录才能发表评论!