ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

imutils库介绍及安装学习

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 imutilsprint(imutils.__builtins__)  # 输出 __builtins__ 模块

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

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

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

import imutilsprint(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 imutilsprint(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 imutilsprint(imutils.__name__)  # 输出 imutils 模块的名称

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

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

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

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

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

import imutilsprint(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)  # 指定宽度,会自动计算相应比例高度,还有参数heightprint('原图大小:',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('骨架提取结果')  # 显示灰度图要声明 grayplt.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 imutilsif __name__ == '__main__':img = cv2.imread('./image/apple.png')logo = cv2.imread('./image/3.png')flag = 5if flag ==0:# 把dir路径下的所有图片名称变成一个列表,支持dir文件夹下多个子文件夹图片名称提取from imutils import pathsdir = 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 itrotated_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 itresized = 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 uptranslated = imutils.translate(img,25,-75)cv2.imshow('translate', translated)cv2.waitKey()cv2.destroyAllWindows()if flag ==5:#白图像黑背景画出图像轮廓结构#skeletonize the imagegray = cv2.cvtColor(logo,cv2.COLOR_BGR2GRAY)skeleton = imutils.skeletonize(gray,size=(3,3))cv2.imshow("Skeleton",skeleton)cv2.waitKey()cv2.destroyAllWindows()

返回列表