原文:https://blog.csdn.net/dcrmg/article/details/53543341

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

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/dcrmg/article/details/53543341

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

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

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

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

Tenengrad梯度方法

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

 
  1. #include <highgui/highgui.hpp>

  2. #include <imgproc/imgproc.hpp>

  3. using namespace std;

  4. using namespace cv;

  5. int main()

  6. {

  7. Mat imageSource = imread("2.jpg");

  8. Mat imageGrey;

  9. cvtColor(imageSource, imageGrey, CV_RGB2GRAY);

  10. Mat imageSobel;

  11. Sobel(imageGrey, imageSobel, CV_16U, 1, 1);

  12. //图像的平均灰度

  13. double meanValue = 0.0;

  14. meanValue = mean(imageSobel)[0];

  15. //double to string

  16. stringstream meanValueStream;

  17. string meanValueString;

  18. meanValueStream << meanValue;

  19. meanValueStream >> meanValueString;

  20. meanValueString = "Articulation(Sobel Method): " + meanValueString;

  21. putText(imageSource, meanValueString, Point(20, 50), CV_FONT_HERSHEY_COMPLEX, 0.8, Scalar(255, 255, 25), 2);

  22. imshow("Articulation", imageSource);

  23. waitKey();

  24. }

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

Laplacian梯度方法:

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

 
  1. #include <highgui/highgui.hpp>

  2. #include <imgproc/imgproc.hpp>

  3. using namespace std;

  4. using namespace cv;

  5. int main()

  6. {

  7. Mat imageSource = imread("1.jpg");

  8. Mat imageGrey;

  9. cvtColor(imageSource, imageGrey, CV_RGB2GRAY);

  10. Mat imageSobel;

  11. Laplacian(imageGrey, imageSobel, CV_16U);

  12. //Sobel(imageGrey, imageSobel, CV_16U, 1, 1);

  13. //图像的平均灰度

  14. double meanValue = 0.0;

  15. meanValue = mean(imageSobel)[0];

  16. //double to string

  17. stringstream meanValueStream;

  18. string meanValueString;

  19. meanValueStream << meanValue;

  20. meanValueStream >> meanValueString;

  21. meanValueString = "Articulation(Laplacian Method): " + meanValueString;

  22. putText(imageSource, meanValueString, Point(20, 50), CV_FONT_HERSHEY_COMPLEX, 0.8, Scalar(255, 255, 25), 2);

  23. imshow("Articulation", imageSource);

  24. waitKey();

  25. }

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

方差方法:

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

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

 
  1. #include <highgui/highgui.hpp>

  2. #include <imgproc/imgproc.hpp>

  3. using namespace std;

  4. using namespace cv;

  5. int main()

  6. {

  7. Mat imageSource = imread("2.jpg");

  8. Mat imageGrey;

  9. cvtColor(imageSource, imageGrey, CV_RGB2GRAY);

  10. Mat meanValueImage;

  11. Mat meanStdValueImage;

  12. //求灰度图像的标准差

  13. meanStdDev(imageGrey, meanValueImage, meanStdValueImage);

  14. double meanValue = 0.0;

  15. meanValue = meanStdValueImage.at<double>(0, 0);

  16. //double to string

  17. stringstream meanValueStream;

  18. string meanValueString;

  19. meanValueStream << meanValue*meanValue;

  20. meanValueStream >> meanValueString;

  21. meanValueString = "Articulation(Variance Method): " + meanValueString;

  22. putText(imageSource, meanValueString, Point(20, 50), CV_FONT_HERSHEY_COMPLEX, 0.8, Scalar(255, 255, 25), 2);

  23. imshow("Articulation", imageSource);

  24. waitKey();

  25. }

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

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

相机自动对焦 OpenCV 图像清晰度评价相关推荐

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

    最近想实现相机自动对焦,也就是需要图像清晰度评价,在网上查找. 第一个不错文章是:无参考图像的清晰度评价方法 http://nkwavelet.blog.163.com/blog/static/227 ...

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

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

  3. opencv java图片清晰度_OpenCV 图像清晰度评价(相机自动对焦)

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

  4. opencv系列-图像清晰度评价

    opencv系列-图像清晰度评价 1,换了opencv3.4,用来测试 2,opencv好评呀 图像清晰度评价算法有很多种,在空域中,主要思路是考察图像的领域对比度,即相邻像素间的灰度特征的梯度差:在 ...

  5. 图像处理:图像清晰度评价

    目录 0.实现效果 1.概述 2.模糊度分类 1.运动模糊 2.压缩模糊 3.高斯模糊 3.清晰度量化指标 Brenner 能量梯度函数(Energy of Gradient) ​编辑 Roberts ...

  6. 基于强边缘有效性统计的图像清晰度评价

    摘要 图像清晰度评价是图像质量评价中的一个重要组成部分,对于自动对焦.图像压缩.视频封面提取等应用具有重要意义.目前图像清晰度评价可分为有参考图像清晰度评价和无参考图像清晰度评价[1]. 对于无参考清 ...

  7. 图像清晰度评价(C#)

    ** 图像清晰度评价(C#) ** 在空域中,图像领域对比度即为相邻像素间的灰度特征的像素差.在频域中,图像频域分量,对焦清晰的图像高频分量多,对焦模糊的图像低频分量多. 图像清晰评价通常使用三种算法 ...

  8. 图像清晰度评价15种方法对比

    在无参考图像的质量评价中,图像的清晰度是衡量图像质量优劣的重要指标,它能够较好的与人的主观感受相对应,图像的清晰度不高表现出图像的模糊.本文针对无参考图像质量评价应用,对目前几种较为常用的.具有代表性 ...

  9. 无参考图像清晰度评价

    转自: http://nkwavelet.blog.163.com/blog/static/227756038201461532247117 在无参考图像的质量评价中,图像的清晰度是衡量图像质量优劣的 ...

最新文章

  1. 最新SOTA模型和实现代码
  2. POJ 2480 (约数+欧拉函数)
  3. [.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(三) 利用多线程提高程序性能(下)...
  4. 以不同的维度去看待问题
  5. SAP固定资产的几个关键日期
  6. Exp3 免杀原理与实践 20154320 李超
  7. Android Studio-目录结构
  8. clickhouse语句_篇四|ClickHouse的可视化界面与集群状态监控
  9. 初试 spring web mvc
  10. 概率与信息论---贝叶斯规则
  11. (Zotero)开源的文献管理器 真香
  12. 初识计算机编程语言教案,完整版,初识VB教学设计
  13. 跨域 No 'Access-Control-Allow-Origin' header is present on the requested resource
  14. fx2n4ad模块中文手册_特殊功能模块FX2N-4AD用户指南手册三菱FX2N-4AD手册 - 广州凌控...
  15. Xcode9 iOS12 支持包
  16. 微信小程序图片加载错误,显示优化
  17. Web大学生网页成品——英雄联盟LOL游戏网站制作与实现(HTML+CSS+JS)
  18. 易宝支付回调不成功问题解决
  19. shell中的let命令
  20. iOS 应用唤起淘宝到指定商店页面

热门文章

  1. android开发--详解ListView,动态添加,删除Adapter中的数据项
  2. android 设置单边框,详解Android用Shape制作单边框图的两种思路和坑
  3. 专题 15 TCP套接字编程
  4. linux下搭建基于python的vim,Linux下搭建基于python的VIM-Go语言中文社区
  5. mysql 去重 根据id_超详细的四类数据库去重实现方案汇总,值得收藏
  6. python输入球的半径_基于用户输入半径的Myro移动机器人
  7. 计算机操作系统课设总结,计算机操作系统课程设计
  8. html给文字加动态效果,20种配合场景的CSS3鼠标滑过文字动画特效
  9. mysql againts函数_MariaDB / MySQL TO_SECONDS和AGGREGATE函数
  10. 再见XShell!这款国产终端更好用!