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

2023-05-16

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

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

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

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

Tenengrad梯度方法


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


#include <highgui/highgui.hpp>
#include <imgproc/imgproc.hpp>
 
using namespace std;
using namespace cv;
 
int main()
{
    Mat imageSource = imread("2.jpg");
    Mat imageGrey;
 
    cvtColor(imageSource, imageGrey, CV_RGB2GRAY);
    Mat imageSobel;
    Sobel(imageGrey, imageSobel, CV_16U, 1, 1);
 
    //图像的平均灰度
    double meanValue = 0.0;
    meanValue = mean(imageSobel)[0];
 
    //double to string
    stringstream meanValueStream;
    string meanValueString;
    meanValueStream << meanValue;
    meanValueStream >> meanValueString;
    meanValueString = "Articulation(Sobel Method): " + meanValueString;
    putText(imageSource, meanValueString, Point(20, 50), CV_FONT_HERSHEY_COMPLEX, 0.8, Scalar(255, 255, 25), 2);
    imshow("Articulation", imageSource);
    waitKey();
}


使用三张测试图片模拟不同对焦。第一张最清晰,得分最高,第二三张越来越模糊,得分依次降低。

 

Laplacian梯度方法:


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


#include <highgui/highgui.hpp>
#include <imgproc/imgproc.hpp>
 
using namespace std;
using namespace cv;
 
int main()
{
    Mat imageSource = imread("1.jpg");
    Mat imageGrey;
 
    cvtColor(imageSource, imageGrey, CV_RGB2GRAY);
    Mat imageSobel;
 
    Laplacian(imageGrey, imageSobel, CV_16U);
    //Sobel(imageGrey, imageSobel, CV_16U, 1, 1);
 
    //图像的平均灰度
    double meanValue = 0.0;
    meanValue = mean(imageSobel)[0];
 
    //double to string
    stringstream meanValueStream;
    string meanValueString;
    meanValueStream << meanValue;
    meanValueStream >> meanValueString;
    meanValueString = "Articulation(Laplacian Method): " + meanValueString;
    putText(imageSource, meanValueString, Point(20, 50), CV_FONT_HERSHEY_COMPLEX, 0.8, Scalar(255, 255, 25), 2);
    imshow("Articulation", imageSource);
    waitKey();
}


用同样的三张测试图片测试,结果一致,随着对焦模糊得分降低:

方差方法:


方差是概率论中用来考察一组离散数据和其期望(即数据的均值)之间的离散(偏离)成都的度量方法。方差较大,表示这一组数据之间的偏差就较大,组内的数据有的较大,有的较小,分布不均衡;方差较小,表示这一组数据之间的偏差较小,组内的数据之间分布平均,大小相近。

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


#include <highgui/highgui.hpp>
#include <imgproc/imgproc.hpp>
 
using namespace std;
using namespace cv;
 
int main()
{
    Mat imageSource = imread("2.jpg");
    Mat imageGrey;
 
    cvtColor(imageSource, imageGrey, CV_RGB2GRAY);
    Mat meanValueImage;
    Mat meanStdValueImage;
 
    //求灰度图像的标准差
    meanStdDev(imageGrey, meanValueImage, meanStdValueImage);
    double meanValue = 0.0;
    meanValue = meanStdValueImage.at<double>(0, 0);
 
    //double to string
    stringstream meanValueStream;
    string meanValueString;
    meanValueStream << meanValue*meanValue;
    meanValueStream >> meanValueString;
    meanValueString = "Articulation(Variance Method): " + meanValueString;
 
    putText(imageSource, meanValueString, Point(20, 50), CV_FONT_HERSHEY_COMPLEX, 0.8, Scalar(255, 255, 25), 2);
    imshow("Articulation", imageSource);
    waitKey();
}


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

在工业应用中,最清晰的对焦拍摄出来的图像不一定是最好的,有可能出现摩尔纹(水波纹)现象,一般需要在最清晰对焦位置附件做一个微调。
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCV 图像清晰度评价算法(相机自动对焦) 的相关文章

  • 比较两幅图像的相似度

    现在以图搜图的功能比较火热 xff0c 很好奇其原理 简单的搜索学习得知 xff0c 实现相似图片搜索的关键技术是 感知哈希算法 xff0c 作用是对每一张图片按照某种规律生成一个对应的指纹字符串 比较不同图片之间的指纹字符串 xff0c
  • 查找文献方法整理

    1 dblp computer science bibliography 在搜索框查找文献关键字 xff0c 或文献标题 xff0c 右边可以筛选 找到想找的论文之后 xff0c 可以将鼠标移到view xff0c 找到原网站 有些网站可以
  • OpenCV进行图像相似度对比的几种办法

    平均哈希算法 实现步骤 缩小尺寸 xff1a 将图像缩小到8 8的尺寸 xff0c 总共64个像素 这一步的作用是去除图像的细节 xff0c 只保留结构 明暗等基本信息 xff0c 摒弃不同尺寸 比例带来的图像差异 xff1b 简化色彩 x
  • opencv学习笔记(六)直方图比较图片相似度

    opencv学习笔记 xff08 六 xff09 直方图比较图片相似度 opencv提供了API来比较图片的相似程度 xff0c 使我们很简单的就能对2个图片进行比较 xff0c 这就是直方图的比较 xff0c 直方图英文是histogra
  • 完整opencv(emgucv)人脸、检测、采集、识别、匹配、对比

    成对几何直方图匹配 public static string MatchHist string haarXmlPath 61 64 34 haarcascade frontalface alt tree xml 34 HaarCascade
  • OpenCV学习笔记——判断两张图的相似度

    判断两张图的相似度 方法 直方图对比法ORB算法 实验 1 直方图对比法 参考如何使用OpenCV3直方图方法进行人脸相似度对比 因为我的环境是VS2010 43 OpenCV2 4 8 xff0c 所以在原版的基础上做了一点小修改 inc
  • 【OpenCV】直方图应用:直方图均衡化,直方图匹配,对比直方图

    本文链接 xff1a https blog csdn net xiaowei cqu article details 7606607 前面介绍了 数字图像灰度直方图 xff0c 现在来尝试直方图的应用 直方图均衡化 直方图均衡化 xff08
  • C# Socket服务器及多客户端连接应用例程

    服务端代码 控制台示例 static List lt Socket gt Sockets 61 new List lt Socket gt static void Main string args int port 61 10 byte b
  • C#Socket文件传输(发送与接收代码)

    原文链接 xff1a http www cnblogs com reynoldchan p 3762014 html 这里是发送的代码 xff1a SendVarData是转码后发送函数 1 lt summary gt 2 发送文件 3 l
  • C# Socket服务端与客户端通信(包含大文件的断点传输)

    步骤 xff1a 一 服务端的建立 1 服务端的项目建立以及页面布局 2 各功能按键的事件代码 1 xff09 传输类型说明以及全局变量 2 xff09 Socket通信服务端具体步骤 xff1a xff08 1 xff09 建立一个Soc
  • C# Socket案例(服务端与客户端)

    本文链接 xff1a https blog csdn net qq 42203978 article details 80520299 服务端完整代码 using System using System Net using System N
  • C#中的Socket编程-TCP客户端

    TCP客户端 using System using System Collections Generic using System Linq using System Net using System Net Sockets using S
  • 最小花费(图论算法)

    Description 在n个人中 xff0c 某些人的银行账号之间可以互相转账 这些人之间转账的手续费各不相同 给定这些人之间转账时需要从转账金额里扣除百分之几的手续费 xff0c 请问A最少需要多少钱使得转账后B收到100元 Input
  • C#获取本机IP地址字符串

    1 using System Net 2 using System Net Sockets 3 4 lt summary gt 5 获取本机IP地址 6 lt summary gt 7 lt returns gt 本机IP地址 lt ret
  • C#中Socket通信用法实例详解

    本文实例讲述了C 中Socket通信用法 分享给大家供大家参考 具体如下 xff1a 一 UDP方式 xff1a 服务器端代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
  • 内存溢出问题分析

    System OutOfMemoryException 大多是数据处理的过程中 xff0c 对内存资源的管控太过于粗放 建议对于非托管资源的使用不要过于随意 内存分配的时候使用内存池的模式 xff0c 避免内存泄露和内存碎片 你的指针可能成
  • C# GC 垃圾回收机制原理

    转载参照自以下文章 xff1a http www cnblogs com fdyang p 3456258 html c 销毁资源和释放内存 https www cnblogs com Jessy articles 2552839 html
  • c++中 结构体和类的区别

    区别 xff1a 结构是一种用关键字struct声明的自定义数据类型 与类相似 xff0c 也可以包含构造函数 xff0c 常数 xff0c 字段 xff0c 方法 xff0c 属性 xff0c 索引器 xff0c 运算符和嵌套类型等 xf
  • 结构体和类的区别

    结构体和类的区别 xff1a 在做一个项目时 xff0c 使用了较多的结构体 xff0c 并且存在一些结构体的嵌套 xff0c 即某结构体成员集合包含另一个结构体等 xff0c 总是出现一些奇怪的错误 xff0c 才终于下决心好好分析一下到
  • C++程序内存分配方式(堆与栈)

    一 内存布局 1 栈区 xff08 stack xff09 xff1a 由编译器自动分配释放 xff0c 存放函数的参数值 xff0c 局部变量值等 xff0c 其操作方法类似数据结构中的栈 2 堆区 xff08 heap xff09 xf

随机推荐

  • 值引用和引用问题分析

    在c 43 43 中 xff0c 声明一个全局变量A a xff0c 然后在一个局部函数中创建类型A c赋值给a xff0c 对于值类型 xff0c 如结构体等 xff0c 是在栈中分配内存c xff0c 然后拷贝其内存所有值给a xff0
  • vs中寄存器调试窗口可看出程序是多少位运行的及cpu寄存器使用情况

    如果不清楚程序是多少位运行的 xff0c 可在vs中的调试 gt 寄存器调试窗口查看寄存器的寻址位数 xff0c 如果是32位的exe则寄存器寻址显示32位 xff0c 64位的exe则显示64位寻址 1 根据IntPtr Size来判断
  • CentOS6 Squid代理服务器的安装与配置

    一 简介 代理服务器英文全称是Proxy Server xff0c 其功能就是代理网络用户去取得网络信息 Squid是一个缓存Internet 数据的软件 xff0c 其接收用户的下载申请 xff0c 并自动处理所下载的数据 当一个用户想要
  • c++中类型用new和不用new的区别

    解析一 xff1a new创建类对象 xff0c 使用完后需使用delete删除 xff0c 跟申请内存类似 所以 xff0c new有时候又不太适合 xff0c 比如在频繁调用场合 xff0c 使用局部new类对象就不是个好选择 xff0
  • C# Thread开启线程几种方式

    using System using System Collections Generic using System Linq using System Text using System Threading using System Th
  • C#多线程与UI响应 防止界面假死不响应(子线程创建的窗体获取消息响应用Application.DoEvent )

    一 xff0e 概述 在使用C 进行应用程序设计时 xff0c 经常会采用多线程的方式进行一些后台任务的工作 对于不同的应用场景 xff0c 使用的策略也不尽相同 1 后台循环任务 xff0c 少量UI更新 xff1a 例如批量上传文件 x
  • c#中通过截获windows消息禁止改变窗体大小

    private const int WM SYSCOMMAND 61 0x112 private const int MF REMOVE 61 0x1000 private const int SC RESTORE 61 0xF120 还原
  • C#中Monitor和Lock的用法区别

    1 Monitor Enter object 方法是获取锁 xff0c Monitor Exit object 方法是释放锁 xff0c 这就是Monitor最常用的两个方法 xff0c 当然在使用过程中为了避免获取锁之后因为异常 xff0
  • C#数组按值和按引用传递数组区别

    C 中 xff0c 存储数组之类对象的变量并不是实际存储对象本身 xff0c 而是存储对象的引用 按值传递数组时 xff0c 程序将变量传递给方法时 xff0c 被调用方法接受变量的一个副本 xff0c 因此在被调用时试图修改数据变量的值时
  • C#多线程、并发与并行概念

    软件开发 xff0c 网站开发过程中经常有并发 xff0c 并行 这样的多线程 处理与应用 因此 xff0c 有必要对其进行了解与掌握 多线程 xff1a 在了解线程之前 xff0c 要先知道进程这个概念 进程是一个具有独立功能的程序关于某
  • 窗口句柄、窗口类对象的关系

    HWND hwnd xff1b 窗口句柄 CWnd wnd xff1b 窗口类对象 窗口类对象中有一个成员是窗口句柄 窗口句柄 xff0c 提供了窗口的一个标识 xff0c 类似于指针的概念 xff0c 每一个窗口都对应了一个窗口句柄作为其
  • C#对比图片相似度算法

    参考Neal Krawetz博士的这篇文章 实现这种功能的关键技术叫做 34 感知哈希算法 34 Perceptual Hash Algorithm 意思是为图片生成一个指纹 字符串格式 两张图片的指纹越相似 说明两张图片就越相似 但关键是
  • Opencv中Mat图的长、宽、行、列以及图像像素的概念问题

    在Opencv2中基本上都是用的Mat来表示图像了 xff0c C 43 43 的函数调用中基本上也都是Mat图 xff0c 从根本上说 xff0c 一张图像是一个由数值组成的矩阵 xff0c 矩阵的每一个元素代表一个像素 对于灰度图像而言
  • 2023Java最新真实面试题汇总(持续更新)

    一 面经 适当夸夸面试官 xff08 或所在公司 xff09 不会有坏处 如果某个问题完全不会 xff08 或稍微懂点 xff09 xff0c 直接承认 xff08 或略作回答 xff09 并把话题引导向类似话题 xff08 redis集群
  • Windows Media Foundation 音视频采集 小记

    写在前面 我是个讲文明的人 不过有的时候实在忍不住了也要吐槽几句 xff1a 1 我真是跟不上时代 xff0c 到现在了还在研究 Windows 应用开发 咳 xff1b 2 DirectShow 是傻X xff01 我只是想要获取 Cam
  • 关于C++中vector和set使用sort方法进行排序

    C 43 43 中vector和set都是非常方便的容器 xff0c sort方法是algorithm头文件里的一个标准函数 xff0c 能进行高效的排序 xff0c 默认是按元素从小到大排序 将sort方法用到vector和set中能实现
  • C#调用C++(opencv)中图片数据传递的问题

    C 43 43 DLL代码 xff1a C 代码 xff1a 课题需要做一个界面 xff0c 因为某些原因不能用emgucv xff0c 需要在C winform中调用opencv的方法 xff0c 用opencv处理图片之后再传回到C p
  • c#调用c++(Opencv)dll的实例

    c 43 43 代码 MYDLL int GetCenterPos uchar imageData int step int widthValue int heightValue int BinaryThreshold int LineBl
  • OpenCV图像锐化/增强

    OpenCV图像锐化 增强 0 综述 1 Laplacian高通滤波算子 2 Laplacian锐化代码实践 3 USM锐化增强算法 4 USM代码实践 0 综述 图像的卷积计算除了可以完成我们前面介绍的模糊去噪 边缘检测等任务外 xff0
  • OpenCV 图像清晰度评价算法(相机自动对焦)

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