相机自动对焦,其实是对相机成像的清晰值得计算,若对焦不清晰,成像的清晰度低,视觉效果模糊。若是在工业检测行业,对焦不准确,可能导致信息不正确;对焦准确的图像,其清晰度高,对比度鲜明,层次明显。
以下实现3种图像清晰度的评判方法:
1:方差法:
方差是概率论中用来考察一组离散数据和其期望(即数据的均值)之间的离散(偏离)程度的度量方法。方差较大,表示这一组数据之间的偏差就较大,组内的数据有的较大,有的较小,分布不均衡;方差较小,表示这一组数据之间的偏差较小,组内的数据之间分布平均,大小相近。对焦清晰的图像相比对焦模糊的图像,它的数据之间的灰度差异应该更大,即它的方差应该较大,可以通过图像灰度数据的方差来衡量图像的清晰度,方差越大,表示清晰度越好。
2:Laplacian梯度法:
Laplacian梯度是求图像梯度的方法,Laplacian(拉普拉斯)算子是一种二阶导数算子,其具有旋转不变性,可以满足不同方向的图像边缘锐化(边缘检测)的要求。通常情况下,其算子的系数之和需要为零。
3:Tenengrad梯度法:Sobel算子
Tenengrad梯度方法利用Sobel算子分别计算水平和垂直方向的梯度,同一场景下梯度值越高,图像越清晰。衡量的指标是经过Sobel算子处理后的图像的平均灰度值,值越大,代表图像越清晰。
public double GetImgQualityScore(Mat src, int flag)
{
Mat imgLaplance = new Mat();
Mat imageSobel = new Mat();
Mat meanValueImage = new Mat();
Mat meanImage = new Mat();
Mat BlurMat = new Mat();
Mat gray = new Mat();
Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY);
//中值模糊 降低图像噪音
//Cv2.MedianBlur(gray, BlurMat, 5);
Cv2.BoxFilter(gray, BlurMat, MatType.CV_8UC3, new OpenCvSharp.Size(11, 11));
string method = string.Empty;
double meanValue = 0;
if (flag == 1)
{
//方差法
Cv2.MeanStdDev(BlurMat, meanValueImage, meanImage);
meanValue = meanImage.At<double>(0, 0);
method = "MeanStdDev";
}
else if (flag == 0)
{
//拉普拉斯
Cv2.Laplacian(BlurMat, imgLaplance, MatType.CV_16S, 5, 1);
Cv2.ConvertScaleAbs(imgLaplance, imgLaplance);
//结果放大两倍,拉开差距
meanValue = Cv2.Mean(imgLaplance)[0] * 2;
method = "Laplacian";
}
else
{
//索贝尔
Cv2.Sobel(BlurMat, imageSobel, MatType.CV_16S, 3, 3, 5);
Cv2.ConvertScaleAbs(imageSobel, imageSobel);
//结果放大两倍,拉开差距
meanValue = Cv2.Mean(imageSobel)[0] * 2;
method = "Sobel";
}
//Cv2.Sobel(gray, imgSobel, MatType.CV_16U, 2, 2);
//meanValue2 = Cv2.Mean(imgSobel)[0];
Cv2.PutText(src, "(" + method + " Method): " + meanValue, new Point(20, 20), HersheyFonts.HersheyPlain, 1, new Scalar(0, 0, 255), 1);
Cv2.ImShow(method, src);
return meanValue;
}
添加引用库:
OpenCvSharpExtern1.rar,OpenCvSharp.dll,opencv_videoio_ffmpeg452.dll
下载链接:
https://download.csdn.net/download/txwtech/87825287https://download.csdn.net/download/txwtech/87825287
待更新。。。