首页 > 其他分享 >openCV 图像清晰度检测

openCV 图像清晰度检测

时间:2024-04-25 17:26:02浏览次数:23  
标签:Mat img image cv2 openCV 图像 清晰度 CV

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

这里实现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;
复制代码

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

 

 

 

在OpenCV中,可以使用拉普拉斯算子来检测图像的清晰度。拉普拉斯算子能够突出图像的边缘,如果图像边缘清晰,则拉普拉拉算子处理后的图像与原图像相比将显示较高的对比度。以下是使用OpenCV进行图像清晰度检测的Python代码示例:

import cv2 import numpy as np   # 读取图像 image = cv2.imread('path_to_your_image.jpg', cv2.IMREAD_GRAYSCALE)   # 应用拉普拉斯算子 laplacian_var = cv2.Laplacian(image, cv2.CV_64F).var()   # 阈值用于判断清晰度 threshold = 100.0   # 判断图像是否清晰 if laplacian_var < threshold: print("图像不够清晰") else: print("图像足够清晰")   # 如果需要可视化结果 # 创建一个新的图层来显示拉普拉斯算子的结果 laplacian_image = cv2.convertScaleAbs(cv2.Laplacian(image, cv2.CV_64F))   # 合并原始图像和拉普拉斯算子结果图像 combined_images = np.hstack((image, laplacian_image))   # 显示结果 cv2.imshow('Clean Detected', combined_images) cv2.waitKey(0) cv2.destroyAllWindows()
 
 

在这个代码中,我们首先读取了一个图像并将其转换为灰度图像。然后,我们使用cv2.Laplacian函数计算拉普拉斯算子的值,并使用.var()方法计算拉普拉斯图像的方差来估计清晰度。根据方差与设定的阈值比较结果,我们可以判断图像是否清晰。如果需要可视化结果,我们可以展示原始图像和拉普拉斯算子处理后的图像。

 

 

 

opencv消除图像反光

消除图像的反光,可以通过以下步骤实现:

  1. 转换图像到 HSV 颜色空间。

  2. 使用 inRange 函数来找到图像中的白色区域,这通常是反光的部分。

  3. 应用掩模以减少反光影响。

以下是使用 Python 和 OpenCV 实现的示例代码:

 
import cv2 import numpy as np   # 读取图像 image = cv2.imread('image_with_reflection.jpg')   # 转换到 HSV 颜色空间 hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)   # 设定白色的阈值范围 # 根据您的图像调整这些阈值 lower_white = np.array([0, 0, 212]) upper_white = np.array([131, 255, 255])   # 创建掩模以找到白色区域 mask = cv2.inRange(hsv, lower_white, upper_white)   # 对原图像和掩模进行位运算 reflection_free = cv2.bitwise_and(image, image, mask=mask)   # 反转掩模得到不含反光的图像 no_reflection = cv2.bitwise_not(mask)   # 将不含反光的图像和原图像进行加权融合 final_image = cv2.addWeighted(cv2.bitwise_and(image, image, mask=no_reflection), 0.7, reflection_free, 0.3, 0)   # 显示和保存结果 cv2.imshow('Original', image) cv2.imshow('Mask', mask) cv2.imshow('Reflection Free', reflection_free) cv2.imshow('No Reflection', no_reflection) cv2.imshow('Final Image', final_image) cv2.waitKey(0) cv2.destroyAllWindows()   # 保存结果 cv2.imwrite('image_without_reflection.jpg', final_image)
 
 

这段代码会显示原图、掩模、去除反光后的图像以及最终融合后的图像。您可能需要根据您的图像调整阈值范围以提取到正确的白色区域。

标签:Mat,img,image,cv2,openCV,图像,清晰度,CV
From: https://www.cnblogs.com/kn-zheng/p/18158167

相关文章

  • Centos7 下安装OpenCV 3.4.6 (本人参考这个步骤,在openEuler操作系统安装了OpenCV 3.4.1
    Centos7下安装OpenCV3.4.6 转自 https://blog.csdn.net/MaXiaoTiancsdn/article/details/115336499(本人参考这个步骤,在openEuler操作系统安装了OpenCV3.4.10的版本)  1.参考资料本文主要参考自以下文章,按照这篇文章的安装过程十分顺利,网上的贴子很多但是很......
  • Hessian矩阵以及在血管增强中的应用&mdash;OpenCV实现【2024年更新】
    有别于广为人知的Sobel、Canny等一阶算法,基于Hessian矩阵能够得到图像二阶结果,这将帮助我们深入分析图像本质。Hessian矩阵在图像处理中有着广泛的应用:其中在图像分割领域,包括边缘检测、纹理分析等;在图像增强领域,包括边缘增强、边缘消除等。本文从Hessian矩阵定义出发,通过清晰简......
  • 【pytorch学习】之线性神经网络-图像分类数据集
    图像分类数据集MNIST数据集(LeCunetal.,1998)是图像分类中广泛使用的数据集之一,但作为基准数据集过于简单。我们将使用类似但更复杂的Fashion‐MNIST数据集(Xiaoetal.,2017)。%matplotlibinlineimporttorchimporttorchvisionfromtorch.utilsimportdatafromt......
  • 基于FPGA的图像累积直方图verilog实现,包含tb测试文件和MATLAB辅助验证
    1.算法运行效果图预览    2.算法运行软件版本Vivado2019.2 matlab2022a 3.算法理论概述      图像累积直方图是一种重要的图像特征表示方法,它统计了图像中像素值累加分布的情况,广泛应用于图像增强、对比度调整、颜色校正、图像分割、目标检测等领域。FP......
  • Python基于opencv实现的人脸识别--入门项目
    先去opencv官网下载人脸识别的训练集https://opencv.org/releases/解压目录要记录主要使用haarcascade_frontalface_default.xml摄像头录入人脸(可选)可以弄一个文件夹,里面放一堆图片importcv2face_name='xxxx'#该人脸的名字#加载OpenCV人脸检测分类器face_cas......
  • 编译用于Qt的opencv问题解决
    CMakewasunabletofindabuildprogramcorrespondingto"MinGWMakefiles"解释:这个错误表明CMake无法找到用于生成Makefiles的构建程序。在使用CMake生成项目文件时,如果指定了"MinGWMakefiles",CMake需要一个Make工具来构建项目,而这个工具通常是由MinGW提供的。如......
  • 数字图像处理案例-第16个
    condaconfig--addchannelshttps://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/condaconfig--addchannelshttps://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/condaconfig--addchannelshttps://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-f......
  • 使用归一化盒过滤器对图像进行平滑处理
    使用归一化盒过滤器对图像进行平滑处理前言在OpenCV中提供了一些函数将不同的线性滤波器应用于平滑图像:NormalizedBoxFilter归一化盒过滤器GaussianFilter高斯滤波器MedianFilter中值滤波器BilateralFilter双边过滤器其中归一化盒过滤器是最简单的,我们就从归一......
  • 1.图像滤波与图像融合
    importnumpyasnpdefcreate_gaussian_kernel(k,sigma):center=k//2kernel=np.zeros((k,k),dtype=np.float32)foriinrange(k):forjinrange(k):kernel[i,j]=(1/(2*np.pi*sigma**2))*np.exp(......
  • 1.0 - Opencv简记
    图像存储原理:RGB、CMY、HSV(H:色调,S:饱和度,颜色浓淡,V:亮度)。 Opencv应用:1)HSV颜色空间,利用H提取颜色。2)仿射变换通过三对点求出变换矩阵M;透视变换通过四对点求出变换矩阵M。3)二值化操作:普通二值化、自适应二值化(判断黑白的阈值由像素点邻域的像素确定)。......