OpenCv案例(七): 基于OpenCvSharp计算图像的清晰度(自动对焦)

自动对焦,其实是对相机成像的清晰值得计算,若对焦不清晰,成像的清晰度低,视觉效果模糊。若是在工业检测行业,对焦不准确,可能会造成严重后果;对焦准确的图像,其清晰度高,对比度鲜明,层次明显。

以下实现3种图像清晰度的评价方法:

1:方差方法:

        方差是概率论中用来考察一组离散数据和其期望(即数据的均值)之间的离散(偏离)程度的度量方法。方差较大,表示这一组数据之间的偏差就较大,组内的数据有的较大,有的较小,分布不均衡;方差较小,表示这一组数据之间的偏差较小,组内的数据之间分布平均,大小相近。对焦清晰的图像相比对焦模糊的图像,它的数据之间的灰度差异应该更大,即它的方差应该较大,可以通过图像灰度数据的方差来衡量图像的清晰度,方差越大,表示清晰度越好。

2:Laplacian梯度方法:

        Laplacian梯度是求图像梯度的方法,Laplacian(拉普拉斯)算子是一种二阶导数算子,其具有旋转不变性,可以满足不同方向的图像边缘锐化(边缘检测)的要求。通常情况下,其算子的系数之和需要为零。

3:Tenengrad梯度方法:

        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;
        }

实验结果:

        方差法:

OpenCv案例(七): 基于OpenCvSharp计算图像的清晰度(自动对焦)

OpenCv案例(七): 基于OpenCvSharp计算图像的清晰度(自动对焦)

         Laplacian:

OpenCv案例(七): 基于OpenCvSharp计算图像的清晰度(自动对焦)

OpenCv案例(七): 基于OpenCvSharp计算图像的清晰度(自动对焦)

         Sobel:        

OpenCv案例(七): 基于OpenCvSharp计算图像的清晰度(自动对焦)

OpenCv案例(七): 基于OpenCvSharp计算图像的清晰度(自动对焦)

 从上述实验结果可以看出Laplacian算法计算结果差值更加明显,可以很好的区分图像层次和清晰度;

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2023年3月28日
下一篇 2023年3月28日

相关推荐