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;
测试结果都是数据越大,图像越清晰的,这里不作展示了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架