openCV 图像清晰度检测

news/2024/5/18 23:56:02

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

这里实现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)
 
 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hjln.cn/news/24779.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Linux:VMware切换仅主机模式并配置静态IP

配置网络编辑器 点击“编辑”->“虚拟网络编辑器”没有仅主机模式的话,可以通过“添加网络”进行新增网络配置。更改虚拟机网路模式 右键“创建的虚拟就”->“设置”登录虚拟机配置静态IP 切换目录到“/etc/sysconfig/network-scripts/”修改“if-ens33”文件TYPE=Ether…

日志服务 HarmonyOS NEXT 日志采集最佳实践

背景信息 随着数字化新时代的全面展开以及 5G 与物联网(IoT)技术的迅速普及,操作系统正面临前所未有的变革需求。在这个背景下,华为公司自主研发的鸿蒙操作系统(HarmonyOS)应运而生,旨在满足万物互联时代的多元化设备接入、高效协同和安全可靠运行的需求。 HarmonyOS 不…

[IOI2019] 景点划分

连通块划分令人忍俊不禁的是,11 月的模拟赛出现了 “摩拉克斯” 一题,被取之。2 月 JOISC 出现这个模型,被取之。2 月模拟赛出现这个模型,被取之。本题再次出现这个模型,被取之。 呃呃呃呃呃呃呃呃呃啊。 首先进行一些简单的分析:令 \(A\le B\le C\),构造 \(A,B\) 合法的…

网络拓扑—WEB-IIS服务搭建

均使用Windows Server 2003进行搭建目录WEB-IIS服务搭建网络拓扑配置网络IISPC安装IIS服务配置IIS服务(默认站点)PC机访问网页配置IIS服务(新建站点)PC机访问网页 WEB-IIS服务搭建 网络拓扑//交换机忽略不计 IIS服务IP:192.168.1.1 PC机IP:192.168.1.2配置网络 IISPC安装…

RocketMQ定时/延时消息

什么是延时消息 当消息写入到Broker后,在指定的时长后才可被消费处理的消息,称为延时消息。 采用RocketMQ的延时消息可以实现定时任务的功能,而无需使用定时器。典型的应用场景是,电商交 易中超时未支付关闭订单的场景,12306平台订票超时未支付取消订票的场景。在电商平台…

Android开发中Button背景颜色不能修改问题及解决方法

问题: 使用Android Studio进行android开发时,不管是拖出来的Button,还是自己设置的Button,Button的背景色一直无法修改,呈现系统默认的紫色。 例如我的代码,预览按钮的时候应该是彩色,但还是默认的颜色:紫色 问题原因: 出现该问题的原因主要是因为使用Android Studio …

用“芯”服务,安安“芯芯” 经纬恒润功能安全软件库SAFETY BASE V1.0正式发布

基于目前的市场需求,经纬恒润产品安全团队潜心研发,现正式推出满足ISO26262的安全软件库SAFETY BASE V1.0(满足EGAS L3)。 当前,半导体厂商在进行满足功能安全芯片开发时,除由其自身实现的安全机制以外,还会在安全手册(safety manual)中提出大量需要被自主研发的…