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

news2025/7/9 5:58:17

目录

0、实现效果

1、概述

2、模糊度分类

1、运动模糊

2、压缩模糊

3、高斯模糊

3、清晰度量化指标

Brenner

能量梯度函数(Energy of Gradient)

           ​编辑

Roberts

Laplace

SMD(灰度方差)函数

SMD2 (灰度方差乘积)函数

4、图像清晰度评价实现

 5、总结与评价

参考资料:


0、实现效果

能够通过一张标准图,对同一组相机拍摄的照片进行清晰度评价。

1、概述

图像清晰度是用来指导调焦机构找到正焦位置的评价函数。理想的清晰度评价曲线类似于泊松分布,请看下图:

p点对应于正焦位置,P1 和P2 为正焦位置焦前和焦后采集到图像的清晰度评价结果。

正焦的图像比模糊的离焦图像边缘要更加的锐利清晰,相应的边缘像素灰度值变化大,因而会有更大的梯度值,从数学的角度来看图像,它是二维的离散矩阵,利用梯度函数可获取图像的灰度信息,来判别图像的清晰度,在离散信中梯度表现为差分形式。

2、模糊度分类

1、运动模糊

运动模糊是在捕获图像时,快门在打开时间内成像系统和拍摄 对象的短暂相对运动,造成成像在某个方向上形成的模糊。

2、压缩模糊

压缩模糊是图像在进行有损压缩丢失部分信息。

3、高斯模糊

高斯模糊是人为引入的一种模糊,使用高斯低通滤波器对原始图像进行滤波得到的。

3、清晰度量化指标

Brenner

Brenner梯度函数是最简单的梯度评价函数,它只是简单的计算相邻两个像素灰度差的平方,该函数定义如下:
                            D(f)=\sum_{y} \sum_{x}\left | f(x+2,y)-f(x,y)\right |^{2}

f(x,y) 表示图像f对应像素点(x,y)的灰度值,D(f)为图像清晰度计算结果。

python实现:

def brenner(img):
    '''
    :param img:narray 二维灰度图像
    :return: int 图像越清晰越大
    '''
    shapes = np.shape(img)
    output = 0
    for x in range(0, shapes[0]-2):
        for y in range(0, shapes[1]):
            output+=(int(img[x+2,y])-int(img[x,y]))**2
    return output

能量梯度函数(Energy of Gradient)

将 x 方向和 y 方向的相邻像素的灰度值之差的平方和作为每个像素点的梯度值,对所有像素梯度值累加作为清晰度评价函数值,表达式如下所示:

           D(f)=\sum_{x} \sum_{y}\left \{[f(x+1,y)-f(x,y)]^{2}+[f(x,y+1)-f(x,y)]^{2}\right \}

python实现:

def EOG(img):
    '''
    :param img:narray 二维灰度图像
    :return: int 图像越清晰越大
    '''
    shapes = np.shape(img)
    output = 0
    for x in range(0, shapes[0]-1):
        for y in range(0, shapes[1]-1):
            output+=((int(img[x+1,y])-int(img[x,y]))**2+(int(img[x,y+1])-int(img[x,y]))**2)
    return output

Roberts

Roberts函数与能量梯度函数相似,它是利用对角方向像素点灰度值之差。将4个相邻像素点的灰度值交叉相减的平方和作为每个像素点的梯度值,对所有像素梯度值累加作为清晰度评价函数值,表达式如下式所示:

          D(f)=\sum_{x} \sum_{y}\left \{[f(x+1,y+1)-f(x,y)]^{2}+[f(x+1,y)-f(x,y+1)]^{2}\right \}

 python实现:

def Roberts(img):
    '''
    :param img:narray 二维灰度图像
    :return: int 图像越清晰越大
    '''
    shapes = np.shape(img)
    output = 0
    for x in range(0, shapes[0]-1):
        for y in range(0, shapes[1]-1):
            output+=((int(img[x+1,y+1])-int(img[x,y]))**2+(int(img[x+1,y])-int(img[x,y+1]))**2)
    return output

Laplace

采用Laplace算子与图像各个像素点的灰度值进行卷积得到一个梯度矩阵记为G(x,y),取各像素点梯度的平方和作为评价函数,如下式所示:

                                                 D(f)=\sum_{x} \sum_{y}\textit{G}^{2}(x,y)

                                        ​​​​​​​           \textit{G}(x,y)=f(x,y)\otimes L

                                                    L=\begin{bmatrix} 0& 1 & 1\\ 1 & -4&1 \\ 0 & 1& 0 \end{bmatrix}

 python实现:

def Laplacian(img):
    '''
    :param img:narray 二维灰度图像
    :return: int 图像越清晰越大
    '''
    return cv2.Laplacian(img,cv2.CV_64F).var()

 由于之前推导过,你可以查看此文,这是我以前所写的一篇博客:(2条消息) 图像处理:边缘检测原理_夏天是冰红茶的博客-CSDN博客

SMD(灰度方差)函数

当完全聚焦时,图像最清晰,图像中的高频分量也最多,故可将灰度变化作为聚焦评价的依据,灰度方差法的公式如下:

                      D(f)=\sum_{y} \sum_{x}(\left |f(x,y)-f(x,y-1) \right |+\left |f(x+1,y)-f(x,y) \right |)

python实现:

def SMD(img):
    '''
    :param img:narray 二维灰度图像
    :return: int 图像越清晰越大
    '''
    shape = np.shape(img)
    output = 0
    for x in range(1, shape[0]-1):
        for y in range(0, shape[1]):
            output+=math.fabs(int(img[x,y])-int(img[x,y-1]))
            output+=math.fabs(int(img[x,y]-int(img[x+1,y])))
    return output

SMD2 (灰度方差乘积)函数

SDM函数具有较好的计算性能,但其缺点也很明显,即在焦点附近灵敏度不高,即该函数在极值点附近过于平坦,从而导致聚焦精度难以提高。在《一种快速高灵敏度聚焦评价函数》中李郁峰等人在论文中提出了一种新的评价函数,称之为灰度方差乘积法,即对每一个像素领域两个灰度差相乘后再逐个像素累加,该函数定义如下:

                 D(f)=\sum_{y} \sum_{x}(\left |f(x,y)-f(x+1,y) \right |*\left |f(x,y)-f(x,y+1) \right |)

python实现:

def SMD2(img):
    '''
    :param img:narray 二维灰度图像
    :return: int 图像约清晰越大
    '''
    shape = np.shape(img)
    output = 0
    for x in range(0, shape[0]-1):
        for y in range(0, shape[1]-1):
            output+=math.fabs(int(img[x,y])-int(img[x+1,y]))*math.fabs(int(img[x,y]-int(img[x,y+1])))
    return output

4、图像清晰度评价实现

SWD2:

import cv2
import pyps.pyzjr.definition as din
import pyps.pyzjr.utility as ult


image=ult.read_resize_image("./compare/8881.jpg",space=True)
img = din.SMD2(image)
print(img)

cv2.putText(image, f"definition:{img:.2f}", (10, 30),
            cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 3)
cv2.imshow("definition_Image", image)

cv2.waitKey(0)

Brenner:

Laplacian:

 

 5、总结与评价

很遗憾,本次的清晰度评价失败了,如果想要得到一个边界值几乎不可能实现,哪怕通过大量图像数据(模糊图像与清晰图像)也不能完成,因为这些清晰度量化指标函数都是通过求图像像素的梯度,换汤不换药,在不同场景不同模糊的条件下很难去进行比对。

参考资料:

图像清晰度评价函数 - 知乎 (zhihu.com)

模糊图像检测-无参考图像的清晰度评价 - 知乎 (zhihu.com)

(2条消息) 无参考图像的清晰度评价方法_凌风探梅的博客-CSDN博客

(2条消息) 图像处理:边缘检测原理_夏天是冰红茶的博客-CSDN博客

(2条消息) 11种图像清晰度评价函数附MATLAB代码_姜饼8的博客-CSDN博客_能量梯度函数

图像处理评价指标之模糊度、清晰度(待更新) - 知乎 (zhihu.com)

一种快速高灵敏度聚焦评价函数 - 中国知网 (cnki.net)

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

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

相关文章

JUC学习笔记——并发工具线程池

在本系列内容中我们会对JUC做一个系统的学习,本片将会介绍JUC的并发工具线程池 我们会分为以下几部分进行介绍: 线程池介绍自定义线程池模式之Worker ThreadJDK线程池Tomcat线程池Fork/Join 线程池介绍 我们在这一小节简单介绍一下线程池 线程池简介…

Linux基础教程:9、linux进程管理(2)

前面我们讲到fork创建子进程,那么这一期我们接着讲创建进程之后如何调试以及插入其他进程、特殊进程、和进程如何退出; 同样我们写了一个C语言程序,但是在这个程序中是有两个进程,我们调试的时候只会选择一个进程调试&#xff0c…

了解ixgbe网卡驱动— 驱动注册(纯代码分享)

1 ixgbe 网卡注册驱动 和大部分设备驱动一样,网卡驱动是作为一个 module 注册到 kernel 的 通过 module_init() -> ixgbe_init_module() -> pci_register_driver() 注册 ixgbe_driver 通过 module_exit() -> ixgbe_exit_module() -> pci_unregister_dr…

【仿牛客网笔记】项目进阶,构建安全高效的企业服务——置顶、加精、删除

添加依赖,去掉版本 实现置顶、加精的修改,删除 首先开发数据访问层,因为是对帖子的操作所以无论是置顶、加精最终是要修改帖子,先打开DiscussPostMapper增加修改的操作,一个修改类型,一个修改状态。 打…

[iOS]MonkeyDev安装

MonkeyDev官方安装文档:https://github.com/AloneMonkey/MonkeyDev/wiki/%E5%AE%89%E8%A3%85 1.安装HomeBrew 终端输入指令 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 选择源后安装 更多安装方式可以参…

HTML+CSS+JS大作业:网站设计——家具装修公司(12页 bootstrap, 响应式)

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 公司官网网站 | 企业官网 | 酒店官网 | 等网站的设计与制 | HTML期末大学生网页设计作业,Web大学生网页 HTML:结构 CSS&#…

如何使用VMware12PRO安装Mac OS

VMware安装参考我的这篇文章http://t.csdn.cn/kZ3oh (有VMware安装包) 准备的工具 unlocker链接: https://pan.baidu.com/s/1a1akxL_-JjNu70HJqJORZw?pwd9sjk 提取码: 9sjk Mac OS10.11CDR镜像链接: https://pan.baidu.com/s/1LIz0qFIL0Jg2M83oGqiDW…

RepVGG:让VGG风格的ConvNet再次伟大起来

引言 经典的卷积神经网络(ConvNet)VGG [31]在图像识别中取得了巨大的成功,其简单的架构由conv、ReLU和池化的堆栈组成。随着Inception [33,34,32,19]、ResNet [12]和DenseNet [17]的出现,许多研…

【Struts2】一_idea快速搭建struts2框架

文章目录什么是SSH框架?Struts2框架1、struts2的环境搭建1.1 创建web项目(maven),导入struts2核心jar包1.2 配置web.xml(过滤器),是struts2的入口,先进入1.3 创建核心配置文件struts…

C语言日记 36 类的组合

书P137: 如果声明组合类的对象时没有指定对象的初始值,自动调用无形参的构造函数, 构造内嵌对象时也对应调用内嵌对象的无形参的构造函数。 Q1:这里,对于“构造内嵌对象时也对应调用内嵌对象的无形参的构造函数”;他指的是什么…

STM32F429基于TouchGFX进行简单控制LED和显示ADC值

所需软件: CubeMX KEIL MDK ARM TouchGFX 首先配置外部时钟 配置时钟树,设置180MHZ 使能GPIO口如下,其中PA0用于LED 配置ADC通道 定时器TIM8触发 配置FMC和SDRAM,参数固定 使能DMA2D,参数如下: 配置LTDC 屏幕分…

JAVA反射

今天我们来讲一讲什么是java的反射机制,我们要了解一个新事物之前,我们应该首先的了解它的基本概念,那什么是反射呢? java的反射概念:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象&#…

centos7 安装hadoop

文章目录一、将hadoop的压缩文件传递到虚拟机里面二、解压缩三、配置环境变量一、将hadoop的压缩文件传递到虚拟机里面 路径随意,只要你能到时候能找到压缩文件就行。 二、解压缩 这里我给解压到opt/module目录里(没有可以自己创建,主要是为了方便管理) tar -zx…

Java#15(集合)

一.集合和数组的区别 1.从长度方面: 数组的长度是固定的,而集合的长度不是固定的 2.从存储类型方面: 数组可以存储基本数据类型也可以存储引用数据类型,而集合能存储引用数据类型,若是想要存储基本数据类型要将其变成对应的包装类 创建一个集合 二.ArrayList成员方法 1.boole…

【Spring5】使用JdbcTemplate操作mysql数据库

文章目录1 JdbcTemplate简介及操作准备2 添加操作3 修改与删除操作4 数据库查询操作4.1 返回一个值4.2 返回对象4.3 返回集合5 批量操作5.1 批量添加与修改5.2 批量修改与批量删除写在最后1 JdbcTemplate简介及操作准备 Spring框架对JDBC进行封装,使用JdbcTemplate…

java计算机毕业设计ssm教师贴心宝的设计与实现

项目介绍 随着互联网技术的发发展,计算机技术广泛应用在人们的生活中,逐渐成为日常工作、生活不可或缺的工具,高校各种管理系统层出不穷。高校作为学习知识和技术的高等学府,信息技术更加的成熟,为教师开发必要的系统,能够有效的提升管理效率。近年来,高校规模不断扩大,同时在…

[附源码]SSM计算机毕业设计中达小区物业管理系统JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

c#入参使用引用类型为啥要加ref?

目录 ref修饰入参的常用场景引用类型添加ref的作用是啥?总结那什么是值,什么是引用?大体可以理解为堆栈的区别,在.net中大多数实例存在于托管堆栈中。struct,int32,int64,double,en…

mathtype符号显示不全的问题

目录前言参考问题解决方法补充最后前言 最近在使用Mathtype往Word里插入数学符号时,发现有些符号的间距过大,整个排版不太好看,于是上网查了一下,将方法记录下来。 参考 Word插入数学符号,行间距变大怎么办&#xf…

【408数据结构与算法】—堆排序(二十一)

【408数据结构与算法】—堆排序&#xff08;二十一&#xff09; 一、堆的定义 从堆的定义可以看出&#xff0c;堆实质是满足如下性质的完全二叉树&#xff0c;二叉树中任一非叶子结点均小于&#xff08;大于&#xff09;它的孩子结点 C语言代码实现 #include <stdio.h>…