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

前言 相机的自动对焦要求相机根据拍摄环境和场景的变化,通过相机内部的微型驱动马达,自动调节相机镜头和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();
}
方差数值随着清晰度的降低逐渐降低:
在工业应用中,最清晰的对焦拍摄出来的图像不一定是最好的,有可能出现摩尔纹(水波纹)现象,一般需要在最清晰对焦位置附件做一个微调。

在 I/O 看未来 | 移动设备、Web、AI 和 Google Cloud 更新一览
2022年三季度工业应用移动机器人行业现状分析
音圈电机无人机成救灾黑科技
一加手机连续5年入选中国全球化品牌榜
复位芯片的作用及原理
OpenCV 图像清晰度评价(相机自动对焦)
Java并发包之CAS介绍
EDA技术概况
以太网供电和HDBaseT供电的标准及所具有的的应用优势
什么是电磁继电器,电磁继电器工作原理是什么,电磁继电器由什么组成,电磁继电器如何应用?
传祺GS4 PLUS:搭载2.0T发动机
一名Github高级工程师眼中的理想领导是什么样的?
SQZ正在开发另一种新型肿瘤细胞治疗平台
伊顿发布全新中压智能开关柜iET1系列,实现智能和高效运营的用电体验
15个节省时间的Jupyter技巧!
币币交易所源码开发OTC场外交易所搭建,源中瑞Dave
浅析产业互联网和工业互联网的差异
韩国民众冒雨抗议部署“萨德”,什么是萨德?部署萨德的后果是啥!
不同雷达的电磁信号调制方式
红外热成像助力海事安全