imutils库介绍及安装学习
目录
imutils介绍
? ?
imutils 是一个用于图像处理和计算机视觉任务的 Python 工具包。它提供了一系列方便实用的函数,可以简化常见的图像处理任务,imutils 库的始于 2015 年,作者是 Adrian Rosebrock。实际上,imutils是在OPenCV基础上的一个简单封装从而达到更为简结的调用OPenCV接口的目的,来轻松的实现图像的平移,旋转,缩放,骨架化等一系列的操作。本机安装该库后,可以使用help()函数查看更具体的介绍信息。
本机环境
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(),is_cv4()
:用于检测当前使用的 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__))
调节图像亮度和对比度?
adjust_brightness_contrast函数用于调整图像的亮度和对比度。它接受三个参数:
- image表示输入的图像
- alpha表示亮度调整参数
- beta表示对比度调整参数
亮度调整参数alpha的取值范围为[-1, 1],其中-1表示将图像变暗,1表示将图像变亮;对比度调整参数beta的取值范围为[-100, 100],其中-100表示降低对比度,100表示增加对比度。
下面是一个使用adjust_brightness_contrast函数的示例代码:
import cv2
import imutils
# 读取图像
image = cv2.imread("image.jpg")
# 调整亮度和对比度
#adjusted = imutils.adjust_brightness_contrast(image, alpha=1.2, beta=10)
adjusted = imutils.adjust_brightness_contrast(image, brightness=1.2, contrast=10)
# 显示调整后的图像
cv2.imshow("Adjusted Image", adjusted)
cv2.waitKey(0)
cv2.destroyAllWindows()
在上述代码中,首先使用cv2.imread函数读取一张图像,然后调用adjust_brightness_contrast函数进行亮度和对比度的调整。这里的参数alpha设置为1.2,表示将图像的亮度增加20%;参数beta设置为10,表示增加图像的对比度10个单位。最后,使用cv2.imshow函数显示调整后的图像,并使用cv2.waitKey和cv2.destroyAllWindows函数来保持图像窗口的显示。
综合测试
????????融合以上函数,通过修改代码中的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()
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!