图像处理:模糊图像判断

news2024/9/20 8:56:41

目录

上期回顾

采用Laplace算子的原因

实现的效果

图片素材

代码的展示与讲解

效果展示

项目资源


上期回顾

上一次的图像清晰度评价没有成功,主要的原因是那几张图像清晰度评价函数都实际都采用了梯度求解,不同的场景灰度的明暗不同,梯度可能会很大,无法得到一个界定值来判定图像的清晰度,所以这次我打算只对动态模糊的图像进行判断,是否是动态模糊图像。

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

采用Laplace算子的原因

根据我之前的一个调研,在清晰度评价函数当中,我决定采用Laplace算子,因为它所得到的梯度值较小,容易获得一个模糊判断区间,而其他的几种所获得的梯度值较大,相应的误差范围也将更高,而且在opencv当中就集成了Laplace算子,很轻松就能调用,并得到一个很好的结果。

实现的效果

本次将会使用一组模糊图像和一组标准图像获得模糊判定区间(a,b),我们知道梯度值越大,图像越清晰,所以当我们进行测试一张图像时,它所返回的梯度值小于a,则可以说明它是一个模糊的图像,当返回的梯度值大于b时,则可以说明它是一个清晰的图像,而当返回的梯度值落在了a与b之间,我们也将其放在模糊图像当中。

图片素材

我自己采用的是手机拍摄的照片,分辨率都是1280*960,请注意图像的尺寸与场景会影响返回的梯度值,但我们通常采集的数据都是由相机拍摄,尺寸相同,工业上采用道路裂缝检测的场景基本类似,所以有研究的意义。

代码的展示与讲解

import cv2
import os

def getPhotopath(paths):
    imgfile = []
    file_list=os.listdir(paths)
    for i in file_list:
        newph=os.path.join(paths,i)
        imgfile.append(newph)
    return imgfile

def getImgVar(image):
    imggray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    imageVar = cv2.Laplacian(imggray, cv2.CV_64F).var()
    return imageVar

def getTest(imgfile):
    c = []
    for i in imgfile:
        # print(i)
        img=cv2.imread(i)
        image=getImgVar(img)
        # print(image)
        c.append(float(f"{image:.3f}"))
    if 'test' in imgfile[0]:   #对测试集数据进行反转
        c.sort(reverse=True)
    else:
        c.sort()
    return c

def getThr():
    a=getTest(imgfile1)
    b=getTest(imgfile2)
    thr=(a[0],b[0])
    # print(thr)
    return thr

path1="./test"     #测试的数据集文件夹位置
path2="./Standards"  #标准图的数据文件夹位置
#获取文件下的名称
imgfile1=getPhotopath(path1)
imgfile2=getPhotopath(path2)

#获得阈值
minThr,maxThr=getThr()
print(minThr,maxThr)

def vagueJudge(image):
    img = cv2.imread(image)
    imgVar = getImgVar(img)
    if imgVar>maxThr:
        cv2.putText(img, f"Not Vague{imgVar:.2f}", (12, 70), cv2.FONT_HERSHEY_PLAIN, 3,
                    (255, 0, 0), 3)
    else:
        cv2.putText(img, f"Vague{imgVar:.2f}", (12, 70), cv2.FONT_HERSHEY_PLAIN, 3,
                    (255, 0, 0), 3)
    cv2.imshow("img",img)
    k=cv2.waitKey(0) & 0xFF
image="./Standards/001.jpg"   #需要进行测试的图片
vagueJudge(image)
  • getPhotopath函数:获得文件夹下各个图片路径,输入模糊图片的文件夹,输入标准图像的文件夹,存入列表当中。
  • getImgVar函数:返回图像梯度值。
  • getTest函数:对每个图像进行了梯度值计算后,存入列表当中,对模糊图像的进行列表序列翻转。
  • def getThr函数:获得模糊判定区间(a,b)。
  • vagueJudge函数:对新输入的图像进行模糊判定,只要小于b,就判定为模糊。

效果展示

由于我不想在拍摄新的图片,这里就采用./test文件和./Standards文件的图片。

控制台打印的模糊判定区间:

4.327 65.401

image="./Standards/001.jpg" 

image="./test/01.jpg"

项目资源

GitHub:img-processing-techniques/Sharpness_evaluation/Image processing:fuzzy image judgment at main · Auorui/img-processing-techniques (github.com)

所有资源上传在了GitHub上。 

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

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

相关文章

数据结构栈的实现

目录栈的概念栈的结构声明初始化数据入栈出栈判断栈是否为空取栈顶的值销毁栈栈的概念 栈是一种线性表,插入数据的一端叫栈顶,另一端叫栈底。 入栈:数据从栈顶进入栈中 出栈:数据从栈顶删除 所以,栈的特点就是先进后出…

Spark - OnYARN 模式搭建,并使用 Scala、Java、Python 三种语言测试

一、SparkOnYarn搭建 安装前需要提前安装好 hadoop 环境,关于 HDFS 和 Yarn 集群的搭建可以参考下面我的博客: https://blog.csdn.net/qq_43692950/article/details/127158935 下面是我 Hadoop 的安装结构 主机规划设置主机名角色192.168.40.172node1N…

1. STL六大组件

0. 介绍 STL提供六大组件,它们之间可以彼此套用,如下图所示: 容器(containers):用于存放数据; 算法(algorithms):包含各种常用算法; 迭代器&…

Dubbo-RPC核心接口介绍

前言 Dubbo源码阅读分享系列文章,欢迎大家关注点赞 SPI实现部分 Dubbo-SPI机制 Dubbo-Adaptive实现原理 Dubbo-Activate实现原理 Dubbo SPI-Wrapper 注册中心 Dubbo-聊聊注册中心的设计 Dubbo-时间轮设计 通信 Dubbo-聊聊通信模块设计 RPC 聊聊Dubbo协议 …

go语言日志实现详解(打印日志、日志写入文件和日志切割)

log包定义了Logger类型,该类型提供了一些格式化输出的方法。本包也提供了一个预定义的“标准”logger,可以通过调用函数Print系列(Print|Printf|Println)、Fatal系列(Fatal|Fatalf|Fatalln)、和Panic系列(P…

[附源码]计算机毕业设计JAVA医院挂号管理系统

[附源码]计算机毕业设计JAVA医院挂号管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybati…

简单的咖啡文化静态HTML网页设计作品 DIV布局咖啡馆文化网页模板代码 DW咖啡网站制作成品

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

达梦安装目录各个文件夹解析

达梦安装目录各个文件夹解析 总览: 1、bin目录 bin目录:存放常用命令和.so(shared object)文件(动态链接库类似Windows的ddl文件、Linux的lib目录) 2、bin2目录 bin2目录:存放utf8的lib库 3、data目录 data目录&#…

LeetCode 744. 寻找比目标字母大的最小字母

🌈🌈😄😄 欢迎来到茶色岛独家岛屿,本期将为大家揭晓LeetCode 744. 寻找比目标字母大的最小字母 ,做好准备了么,那么开始吧。 🌲🌲🐴🐴 一、题目名…

Centos7 内核升级(5.4.225)

文章目录一、背景二、在线 yum 安装1)查看当前内核版本信息2)导入仓库源3)选择 ML 或 LT 版本安装4)设置启动5)生成 grub 配置文件6)重启7)验证是否升级成功8)删除旧内核&#xff08…

【应用】布隆过滤器

布隆过滤器布隆过滤器简介及使用场景布隆过滤器底层原理数据添加数据查询布隆过滤器的优缺点Redis 整合布隆过滤器Java 整合布隆过滤器SpringBoot 整合 Redis 使用布隆过滤器布隆过滤器简介及使用场景 布隆过滤器实际上是一列很长的二进制数组,在每个位置上只有 0 …

CommonsCollections4利用链分析

目录 前言: 0x01 代码分析 总结一下利用链: POC: 完整的POC: 图 1-1 cc利用链前言: CC4这条链用到了新的Commons-Collections4这个依赖,由于这个依赖与之前的版本具有较大的出入,连groupId和artifactId…

Android 基础知识4-2.1常用控件文本框(TextView)

TextView就是用来显示文本标签的控件&#xff0c;修改使用TextView显示文本的颜色、大小等属性。 实例代码&#xff1a; xml&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.co…

有源晶振与无源晶振的区别

今天就来和大家分享下有源晶振和无源晶振的区别。 1.从外形上有源大部分有源晶振是这种四脚贴片的&#xff0c;差分有源晶振的话一般是6脚的&#xff0c;当然还有其它的一些封装 而无源晶振的有两脚插件的也有和有源晶振一样的这种四脚贴片的 2.无源晶振不需要额外供电&#x…

.移动端适配的解决方案

何为移动端适配 移动端适配就是值在不同的移动端 可以去讲我们的内容适应不同屏幕尺寸大小 我们之前写单位用的是px这个单位 但是这是一个写死的单位 rem 所以我们用一个可变的单位 rem &#xff08;是指用html字体大小作为单位 比如说我们设置html字体大小为16px 那么 …

[附源码]计算机毕业设计基于springboot的残障人士社交平台

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

一篇文章了解MySQL的group by

准备工作&#xff01; 1.本文章MySQL使用的是5.7&#xff0c;引擎使用的是innodb 2. 使用的表结构&#xff08;t1&#xff09;&#xff0c;字段a上有一个索引&#xff0c; 1. group by常用方法&#xff1a; group by的常规用法是配合聚合函数&#xff0c;利用分组信息进行统…

公众号网课查题接口使用方法

公众号网课查题接口使用方法 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 题库&#xff1a;题库后台&#xff08;点击跳转&…

用Hopper修改代理软件端口

背景 用代理软件可以访问google&#xff0c;但是端口经常不固定&#xff0c;从缺省1080变成了随机。 前几天其实已经用Hopper 3.0看了一次&#xff0c;但是好像不支持go&#xff0c;所以没反编译成功&#xff0c;这次换了4.0&#xff0c;支持了go。 Hopper与逆向 逆向的目的…

7.7 网络(二)

接上篇&#xff1a;7.7 网络&#xff08;一&#xff09;_龙赤子的博客-CSDN博客 目录 三 操作系统涉及的网络内容 1 网络栈 2 协议 3 应用 三 操作系统涉及的网络内容 1 网络栈 这里我们重点讨论操作系统里面的网络。这部分在整个网络架构中&#xff0c;属于端的技术。对于端来…