zoukankan      html  css  js  c++  java
  • openCV 图像清晰度检测

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

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

    1.Tenengrad梯度方法

    Tenengrad梯度方法利用Sobel算子分别计算水平和垂直方向的梯度,同一场景下梯度值越高,图像越清晰。以下是具体实现。

        Mat img;
    Mat imgROI;
    Mat imgGray;
    Mat imageSobel;
    //添加图片
    img = Mat(m_frameInfo.uHeight/4, m_frameInfo.uWidth/4,CV_8UC3, pRGB).clone();
        //设置ROI尺寸
    imgROI.create(img.rows, img.cols, CV_8UC3); //生成ROI图 img(Rect(width, height,
    150, 150)).copyTo(imgROI); //转灰度图 cvtColor(imgROI, imgGray, CV_BGR2GRAY); //Sobel算子计算梯度值 Sobel(imgGray, imageSobel, CV_16U, 1, 1); //传值 meanValue = mean(imageSobel)[0];
    //返回值
    return meanValue;

     

     

    这里衡量的指标是经过Sobel算子处理后的图像的平均灰度值,值越大,代表图像越清晰。

    2.Laplacian梯度方法

    Laplacian梯度是另一种求图像梯度的方法,在上例的OpenCV代码中直接替换Sobel算子即可。

        Mat img;
    Mat imgROI;
    Mat imgGray;
    Mat imageSobel;
        //添加图片
        img = Mat(m_frameInfo.uHeight/4, m_frameInfo.uWidth/4,CV_8UC3, pRGB).clone();
        //设置ROI尺寸
        imgROI.create(img.rows, img.cols, CV_8UC3);
        //生成ROI图
        img(Rect(width, height, 150, 150)).copyTo(imgROI);
        //转灰度图
        cvtColor(imgROI, imgGray, CV_BGR2GRAY);
        //Laplacian算子计算梯度值,就换了算子而已
        Laplacian(imageGrey, imageSobel, CV_16U);
        //传值
        meanValue = mean(imageSobel)[0];
        //返回值
        return meanValue;

    测试结果都是数据越大,图像越清晰的,这里不作展示了。

    3.方差方法

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

        Mat img;
    Mat imgROI;
    Mat imgGray;
    Mat imageSobel;
    Mat
    meanValueImage;
        //添加图片
        img = Mat(m_frameInfo.uHeight/4, m_frameInfo.uWidth/4,CV_8UC3, pRGB).clone();
        //设置ROI尺寸
        imgROI.create(img.rows, img.cols, CV_8UC3);
        //生成ROI图
        img(Rect(width, height, 150, 150)).copyTo(imgROI);
        //转灰度图
        cvtColor(imgROI, imgGray, CV_BGR2GRAY);
        //求灰度图像的标准差
        meanStdDev(imageGrey,meanValueImage,imageSobel);
        //传值
        meanValue = mean(imageSobel)[0];
        //返回值
        return meanValue;

    测试结果都是数据越大,图像越清晰的,这里不作展示了。

  • 相关阅读:
    Java环境变量的简记
    win10系统安装postgresql后无法连接
    VB.net Postgresql调用,NpgsqlDataReader,NpgsqlDataAdapter的调用例子。
    Postgresql服务器无法连接(10060错误信息)
    解决visual studio的No EditorOptionDefinition 错误
    从零开始Wordpress建站经验分享,内附耗时及成本
    Servlet端 接收不到4096,8192长度的JSON参数
    Wiser的Junit测试用法
    Oracle表生成JavaBean
    mysql表生成JavaBean
  • 原文地址:https://www.cnblogs.com/zxl971213/p/13639146.html
Copyright © 2011-2022 走看看