imutils库介绍及安装学习

目录

本机环境

安装

函数及属性

列举imutils库信息

属性和函数介绍及使用

属性

常用函数 

方法使用

图像平移

图像缩放

图像旋转

骨架提取

通道转换

OPenCV版本的检测

综合测试


介绍

   imutils 是一个用于图像处理计算机视觉任务的 Python 工具包。它提供了一系列方便实用的函数,可以简化常见的图像处理任务,imutils 库的发展始于 2015 年,作者是 Adrian Rosebrock。实际上,imutils是在OPenCV基础上的一个简单封装从而达到更为简结的调用OPenCV接口的目的,来轻松的实现图像的平移,旋转,缩放,骨架化等一系列的操作。

本机环境

windows10  64位 企业版

python 3.6.8(X64)

imutils == 0.5.3

opencv-python==3.4.2.16

库文件讲解及下载地址:https://github.com/PyImageSearch/imutils 

安装

pip install imutils

        在安装前应确认已安装numpy,scipy,matplotlib和opencv,如果出现缺失包错误,可以使用下面安装命令,会把所有包安装:

pip install NumPy SciPy opencv-python matplotlib imutils

如果安装速度过慢,可以使用 国内镜像连接下载来提高速度:

pip install imutils -i https://pypi.tuna.tsinghua.edu.cn/simple

函数及属性

列举imutils库信息

        在cmd命令下导入imutils后,使用dir(imutils)可以查看该库对应的所有函数及属性相关信息,其中以下划线开始和结束的是对象的内部特殊属性,小写字母开头的表示常用的函数

属性和函数介绍及使用

属性

__builtins__:是一个内置模块,它包含了 Python 的内置函数和异常。__builtins__ 是 Python 语言的一部分,它包含了一些常用的函数和异常,例如 print()len()TypeError 等。这些函数和异常在 Python 的任何地方都可以直接使用,而无需导入任何模块。在 imutils 库中,可以通过以下方式访问 __builtins__

import imutils

print(imutils.__builtins__)  # 输出 __builtins__ 模块

注意: __builtins__ 在 Python 的全局范围内是一个内置模块,而不仅仅在 imutils 库中可用。 

 __cached__: 用于存储模块的缓存文件路径的特殊属性。当一个模块被导入时,Python 会检查模块是否已经有对应的缓存文件。如果有,它会比较缓存文件的时间戳和源文件的时间戳,以确定是否需要重新编译模块,每一个模块基本上都会有这个属性。

__doc__: 在 imutils 库中,__doc__ 属性用于存储模块、类、函数或方法的文档字符串。通过访问 __doc__ 属性,你可以获取对象的文档字符串。以下是一个示例代码,演示如何用 __doc__ 属性获取 imutils 模块中对象的文档字符串:

import imutils

print(imutils.__doc__)             # 输出 imutils 模块的文档字符串
print(imutils.resize.__doc__)      # 输出 resize 函数的文档字符串
print(imutils.rotate_bound.__doc__) # 输出 rotate_bound 函数的文档字符串

输出结果将会是对应对象的文档字符串内容。请注意__doc__ 属性只在导入的模块中可用,而不是在 Python 解释器的交互式控制台中。

__file__:是一个属性,而不是内置函数。在 Python 中,__file__ 是一个用于获取模块文件路径的特殊属性。当一个模块被导入时,Python 会在 __file__ 属性中存储该模块的文件路径。这个属性可以帮助开发者找到模块所在的文件位置,以便进行一些操作,比如读取文件内容、获取文件的元信息等。在 imutils 库中,__file__ 属性可以用来获取 imutils 模块的文件路径。例如,你可以使用以下代码来获取 imutils 模块的文件路径:

import imutils

print(imutils.__file__)

请注意__file__ 属性只在导入的模块中可用,而不是在 Python 解释器的交互式控制台中。 

__loader__: 在 Python 中,__loader__ 是一个特殊属性,用于存储加载模块的加载器(loader)对象。这个属性通常在包(package)或模块中使用。在 imutils 库中,__loader__ 属性用于存储加载 imutils 模块的加载器对象。加载器对象负责加载模块并创建模块对象。以下是一个示例代码,演示如何使用 __loader__ 属性获取 imutils 模块的加载器对象,输出结果将会是一个加载器对象的表示形式。

 __name__:在 Python 中,__name__ 是一个特殊属性,用于存储模块的名称。这个属性通常在包(package)或模块中使用。在 imutils 库中,__name__ 属性用于存储模块的名称。当直接运行一个模块时,__name__ 的值将是 "__main__"。当作为一个模块被导入时,__name__ 的值将是模块的名称。以下是一个示例代码,演示如何使用 __name__ 属性获取 imutils 模块的名称:

import imutils

print(imutils.__name__)  # 输出 imutils 模块的名称

__package__:在 imutils 库中,__package__ 属性用于存储模块或包的名称。具体来说,__package__ 属性表示当前模块或包的名称。以下是一个示例代码,演示如何使用 __package__ 属性获取 imutils 包的名称:

import imutils

print(imutils.__package__)  # 输出 imutils 包的名称

__path__:用于存储模块的路径信息。具体来说,imutils 是一个包,而不仅仅是一个模块。它包含了多个模块和子包。__path__ 属性表示 imutils 包的路径,即该包所在的文件夹的路径。以下是一个示例代码,演示如何使用 __path__ 属性获取 imutils 包的路径信息,输出结果将会是一个包含路径的列表,其中每个元素表示一个路径。:

import imutils

print(imutils.__path__)  # 输出 imutils 包的路径

__spec__:用于存储 imutils 模块的规范。通过访问 __spec__ 属性,你可以获取有关模块的一些信息,比如模块的名称、文件路径、加载器等。以下是一个示例代码,演示如何使用 __spec__ 属性获取 imutils 模块的规范信息:

import imutils

print(imutils.__spec__.name)   # 输出模块名称
print(imutils.__spec__.origin) # 输出模块的文件路径
print(imutils.__spec__.loader) # 输出模块的加载器

__version__:是一个特殊属性,用于存储库的版本号。

常用函数 

1.resize(image, width=None, height=None, inter=cv2.INTER_LINEAR):调整图像大小。可以通过指定 width 或 height 来设置新的图像尺寸,也可以同时指定两者。inter 参数用于指定插值方法,默认为 cv2.INTER_LINEAR

2.rotate(image, angle):旋转图像。angle 参数指定旋转角度,正值表示逆时针旋转,负值表示顺时针旋转。

3.translate(image, x, y):平移图像。image参数是要移动的图像,x  y 参数指定在 x 和 y 轴上的平移距离。

4.grab_contours(cnts):解决 OpenCV 版本兼容性问题的函数,用于从 cv2.findContours() 返回的结果中提取轮廓。

5.rotate_bound(image, angle):安全地旋转图像,确保旋转后的图像完整。

6.auto_canny(image, sigma=0.33):自动计算 Canny 边缘检测的阈值。sigma 参数用于控制阈值的高低。

7.is_cv2() 和 is_cv3():用于检测当前使用的 OpenCV 版本。

8.in_range(image, lower, upper):将图像中的像素值限制在给定的范围内。

        这些函数可以组合使用,以便进行更复杂的图像处理任务。例如,可以使用 resize() 函数将图像调整为指定大小,然后使用 rotate() 函数对图像进行旋转,最后使用 translate() 函数平移图像。

方法使用

图像平移

        OpenCV中也提供了图像平移的实现,要先计算平移矩阵,然后利用仿射变换实现平移,在imutils中可直接进行图像的平移,相对于原来的cv,使用imutiles可以直接指定平移的像素,不用构造平移矩阵。

import numpy as np
import cv2 as cv
import imutils
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号


img = cv.imread('image1.jpg')  # 更改图片地址
translated = imutils.translate(img,100,50)  # 平移函数

plt.figure()
plt.subplot(121)
plt.imshow(img[:,:,::-1])  # img[:,:,::-1]转换是为了转回RGB格式,这样才可以正常显示彩色图像
plt.title('原图')
plt.subplot(122)
plt.imshow(translated[:,:,::-1])
plt.title('平移结果')
plt.show()

图像缩放

        图片的缩放在OPenCV中要注意确保保持宽高比。而在imutils中自动保持原有图片的宽高比,只指定宽度weight和height即可,缩放函数:imutils.resize(img,width=100)

import numpy as np
import cv2 as cv
import imutils
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号


img = cv.imread('image1.jpg')
# 说明一般如果有width参数,就会安装width参数进行缩放,不会理会height参数,如果两个参数不成比例,也是安装width进行缩放
resized = imutils.resize(img,width=100)  # 指定宽度,会自动计算相应比例高度,还有参数height


print('原图大小:',img.shape)
print('缩放后大小', resized.shape)
plt.figure()
plt.subplot(121)
plt.imshow(img[:,:,::-1])
plt.title('原图')
plt.subplot(122)
plt.imshow(resized[:,:,::-1])
plt.title('缩放图')
plt.show()

图像旋转

        在OpenCV中进行旋转时使用的是仿射变换,在这里图像旋转方法是imutils.rotate(),跟2个参数,第一个是图片数据,第二个是旋转的角度,旋转是朝逆时针方向。同时imutils还提供了另一个相似的方法, rotate_round(),它就是按顺时针旋转的。

import numpy as np
import cv2 as cv
import imutils
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号


image = cv.imread('image1.jpg')
# 逆时针旋转
rotated = imutils.rotate(image, 90)                     
# 顺时针旋转
rotated_round = imutils.rotate_bound(image, 90)         # 画图              
plt.figure(figsize=[10, 10])
plt.subplot(1,3,1)
plt.imshow(img[:,:,::-1])
plt.title('原图')
plt.axis("off")
plt.subplot(1,3,2)
plt.imshow(rotated[:,:,::-1])
plt.title('逆时针旋转90度')
plt.axis("off")
plt.subplot(1,3,3)
plt.imshow(rotated_round[:,:,::-1])
plt.title('顺时针旋转90度')
plt.axis("off")
plt.show()

骨架提取

        骨架提取(边缘提取),是指对图片中的物体进行拓扑骨架(topological skeleton)构建的过程,imutils提供的方法是skeletonize(),第二个参数是结构参数的尺寸(structuring element),相当于是一个粒度,越小需要处理的时间越长。注意,不是所有图片都能求出骨架

import cv2 as cv
import imutils
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号


# 1 图像读取
image2 = cv.imread('earth.png')
# 2 灰度化
gray = cv.cvtColor(image2, cv.COLOR_BGR2GRAY)
# 3 骨架提取
skeleton = imutils.skeletonize(gray, size=(7, 7))

# 4 图像展示
plt.figure()
plt.subplot(121),plt.imshow(image2[:,:,::-1]),plt.title('原图')

plt.subplot(122),plt.imshow(skeleton,cmap="gray"),plt.title('骨架提取结果')  # 显示灰度图要声明 gray

plt.show()

通道转换

在OpenCV的Python绑定中,图像以BGR顺序表示为NumPy数组。使用该cv2.imshow功能时效果很好。但是,如果打算使用Matplotlib,该plt.imshow函数将假定图像按RGB顺序排列。调用cv2.cvtColor解决此问题,也可以使用opencv2matplotlib便捷功能。

img = cv.imread("lion.jpeg")
plt.figure()
plt.imshow(imutils.opencv2matplotlib(img))

OPenCV版本的检测

        OpenCV 4发布之后,随着主要版本的更新,向后兼容性问题尤为突出。在使用OPenCV时,应检查当前正在使用哪个版本的OpenCV,然后使用适当的函数或方法。在imutils中的is_cv2()is_cv3()is_cv4()是可用于自动确定当前环境的OpenCV的版本简单的功能。

print("OPenCV版本: {}".format(cv2.__version__))

综合测试

        融合以上函数,通过修改代码中的flag对应的不同数值可以得到不同的函数演示效果。代码和素材下载地址如下:https://mp.csdn.net/mp_download/manage/download/UpDetailed

import numpy as np
import cv2
import imutils

if __name__ == '__main__':
    img = cv2.imread('./image/apple.png')
    logo = cv2.imread('./image/3.png')
    flag = 5
    if flag ==0:
        # 把dir路径下的所有图片名称变成一个列表,支持dir文件夹下多个子文件夹图片名称提取
        from imutils import paths
        dir = r'.\image'
        imagePaths = list(paths.list_images(dir))
        print(imagePaths)
    if flag ==1:
        #查看imutils的相关信息
        print(dir(imutils))
    if flag ==2:
        #图像旋转
        for angle in range(0,360,90): 
          #rotate the image and display it
          rotated_im = imutils.rotate(img,angle=angle)
          cv2.imshow("Angle=%d" % (angle),rotated_im)
          cv2.waitKey()
          cv2.destroyAllWindows()
    if flag ==3:
        # 图片缩放
        for width in (400,300,200,100):
          # resize the image and display it
          resized = imutils.resize(img,width=width)
          cv2.imshow("Width=%dpx"%(width),resized)
          cv2.waitKey()
          cv2.destroyAllWindows()
    if flag ==4:
        #图像平移# translate the image x=25 pixels to the right and y = 75 pixels up
        translated = imutils.translate(img,25,-75)
        cv2.imshow('translate', translated)
        cv2.waitKey()
        cv2.destroyAllWindows()
    if flag ==5:
        #白图像黑背景画出图像轮廓结构
        #skeletonize the image
        gray = cv2.cvtColor(logo,cv2.COLOR_BGR2GRAY)
        skeleton = imutils.skeletonize(gray,size=(3,3))
        cv2.imshow("Skeleton",skeleton)
        cv2.waitKey()
        cv2.destroyAllWindows()

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

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

相关文章

Python爬虫-实现批量抓取王者荣耀皮肤图片并保存到本地

前言 本文是该专栏的第12篇,后面会持续分享python爬虫案例干货,记得关注。 本文以王者荣耀的英雄皮肤为例,用python实现批量抓取“全部英雄”的皮肤图片,并将图片“批量保存”到本地。具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。注意,这里抓取的图片…

centos7中的计划任务

一次调度执行-----at 安装&#xff1a; [rootzaotounan ~]# yum -y install at ​ 启动&#xff1a; [rootzaotounan ~]# systemctl start atd ​ 开机自启动&#xff1a; [rootzaotounan ~]# systemctl enbale atd ​ 语法&#xff1a; at <时间规格> 时间规格参数&…

Linux下C++动态链接库的生成以及使用

目录 一.前言二.生成动态链接库三.使用动态链接库 一.前言 这篇文章简单讨论一下Linux下如何使用gcc/g生成和使用C动态链接库&#xff08;.so文件&#xff09;。 二.生成动态链接库 先看下目录结构 然后看下代码 //demo.h#ifndef DEMO_H #define DEMO_H#include<string&…

键盘打字盲打练习系列之矫正坐姿——4

一.欢迎来到我的酒馆 盲打&#xff0c;矫正坐姿&#xff01; 目录 一.欢迎来到我的酒馆二.继续练习二.矫正坐姿1.键盘与鼠标2.椅子 三.改善坐姿建议 二.继续练习 前面的章节&#xff0c;我们重点向大家介绍了主键盘区指法和键盘键位。经过一个系列的教程学习&#xff0c;相信大…

C语言数据结构-双向链表

文章目录 1 双向链表的结构2 双向链表的实现2.1 定义双向链表的数据结构2.2 打印链表2.3 初始化链表2.4 销毁链表2.5 尾插,头插2.6 尾删,头删2.7 根据头次出现数据找下标2.8 定点前插入2.9 删除pos位置2.10 定点后插入 3 完整代码3.1 List.h3.2 Lish.c3.3 test.c 1 双向链表的结…

redis中缓存雪崩,缓存穿透,缓存击穿等

缓存雪崩 由于原有缓存失效&#xff08;或者数据未加载到缓存中&#xff09;&#xff0c;新缓存未到期间&#xff08;缓存正常从Redis中获取&#xff0c;如下图&#xff09;所有原本应该访问缓存的请求都去查询数据库了&#xff0c;而对数据库CPU和内存造成巨大压力&#xff0c…

数据结构算法-希尔排序算法

引言 在一个普通的下午&#xff0c;小明和小森决定一起玩“谁是老板”的扑克牌游戏。这次他们玩的可不仅仅是娱乐&#xff0c;更是要用扑克牌来决定谁是真正的“大老板”。 然而&#xff0c;小明的牌就像刚从乱麻中取出来的那样&#xff0c;毫无头绪。小森的牌也像是被小丑掷…

C++ 学习系列 -- 实现简单的 String

1 标准库 std::string c 中的 std::string 是一个重要的字符串的类, 我们在日常工作中常常与之打交道。 string是C标准库的重要部分&#xff0c;主要用于字符串处理。使用string库需要在同文件中包括该库 #include<string> std::string 实际上是 std::basic_string<…

基于ssm应急资源管理系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本应急资源管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

jupyter notebook设置代码提示(代码补全)

1.当你打开jupyter notebook时&#xff0c;写代码的时候是默认没有代码提示的。 在base环境依次输入以下四行命令&#xff1a; pip install jupyter_contrib_nbextensions jupyter contrib nbextension install --user pip install jupyter_nbextensions_configurator jupyter …

系统架构设计师教程(二)计算机系统基础知识

系统架构设计师 2.1 计算机系统概述2.2 计算机硬件2.2.1 计算机硬件组成2.2.2 处理器2.2.3 存储器2.2.4 总线2.2.5 接口2.2.6 外部设备 2.3 计算机软件2.3.1 计算机软件概述2.3.2 操作系统2.3.3 数据库关系数据库关系数据库设计的特点及方法关系数据库设计的基本步骤 分布式数据…

python3使用pandas备份mysql数据表

操作系统 &#xff1a;CentOS 7.6_x64 Python版本&#xff1a;3.9.12 MySQL版本&#xff1a;5.7.38 日常开发过程中&#xff0c;会遇到mysql数据表的备份需求&#xff0c;需要针对单独的数据表进行备份并定时清理数据。 今天记录下python3如何使用pandas进行mysql数据表的备…

ubuntu20 安装docker

一.官网安装文档 &#xff08;基本按官方文档安装&#xff09; Install Docker Engine on Ubuntu | Docker Docs 二.安装步骤 1.docker 需要64位操作系统、linux内核要在3.1以上 #uname -r 2.卸载可能存在的旧版本 #sudo apt-get remove docker docker-engine docker-ce …

整数分析 C语言xdoj43

问题描述 给出一个整数n&#xff08;0<n<100000000&#xff09;。求出该整数的位数&#xff0c;以及组成该整数的所有数字中的最大数字和最小数字。 输入说明 输入一个整数n&#xff08;0<n<100000000&#xff09; 输出说明 在一行上依次输出整数n的位…

【无标题】安装环境

这里写目录标题 清华镜像加速 安装cuda11.3 PyTorch 1.10.1https://pytorch.org/get-started/previous-versions/[如果没有可以点Previous pyTorch Versions&#xff0c;这里面有更多的更早的版本](https://pytorch.org/get-started/locally/) 复制非空文件夹cp: -r not specif…

Linux下通过find找文件---通过修改时间查找(-mtime)

通过man手册查找和-mtime选项相关的内容 man find | grep -A 3 mtime # 这里简单介绍了 -mtime &#xff0c;还有一个简单的示例-mtime n Files data was last modified n*24 hours ago. See the comments for -atime to understand how rounding affects the interpretati…

Linux——缓冲区与C库的实现原理

一.缓冲区 1缓冲区的概念 缓冲区的本质就是一段内存 2.缓冲区存在的意义 提高使用者的效率 同时因为缓冲区的存在也提高了操作系统的效率 举例一个例子&#xff1a; 假如你在云南要给你北京的朋友寄东西。方法一&#xff1a;你可以亲自己去北京把东西交给他&#xff0c;方…

28. 深度学习进阶 - LSTM

文章目录 Hi, 你好。我是茶桁。 我们上一节课&#xff0c;用了一个示例来展示了一下我们为什么要用RNN神经网络&#xff0c;它和全连接的神经网络具体有什么区别。 这节课&#xff0c;我们就着上一节课的内容继续往后讲&#xff0c;没看过上节课的&#xff0c;建议回头去好好…

深度学习 | 前馈神经网络与反向传播算法

目录 一、Logistic函数 二、前馈神经网络&#xff08;FNN&#xff09; 三、反向传播算法&#xff08;BP算法&#xff09; ​四、基于前馈神经网络的手写体数字识别 一、Logistic函数 Logistic函数是学习前馈神经网络的基础。所以在介绍前馈神经网络之前&#xff0c;我们首…

消息队列使用指南

介绍 消息队列是一种常用的应用程序间通信方法&#xff0c;可以用来在不同应用程序或组件之间传递数据或消息。消息队列就像一个缓冲区&#xff0c;接收来自发送方的消息&#xff0c;并存储在队列中&#xff0c;等待接收方从队列中取出并处理。 在分布式系统中&#xff0c;消…