Python imutils库核心功能与实战指南
本文介绍Python中基于OpenCV封装的imutils库,涵盖安装方法及图像平移、缩放、旋转、骨架提取等核心功能。通过具体代码示例,展示如何利用imutils简化OpenCV操作,包括处理BGR/RGB格式转换及OpenCV版本检测,帮助开发者高效实现图像预处理任务。
imutils库简介
imutils是一个基于OpenCV构建的Python封装库,旨在简化OpenCV接口的调用。它提供了便捷的图像处理方法,能够轻松实现图像的平移、旋转、缩放以及骨架化等常见操作,显著降低开发复杂度。
安装准备
pip install imutils
在执行安装前,请确保环境中已预先安装numpy、scipy、matplotlib以及opencv库,这些是imutils运行的基础依赖。
若遇到缺失包的报错信息
可执行以下命令一次性安装所有相关依赖包:
pip install NumPy SciPy opencv-python matplotlib imutils
imutils核心功能使用
2.1 图像平移操作
相较于原生OpenCV需要手动构造平移矩阵,imutils允许直接指定平移的像素偏移量,操作更为直观简便。
虽然OpenCV原生支持通过仿射变换实现图像平移,但imutils封装后无需计算矩阵即可直接调用平移功能。
translated = imutils.translate(img,x,y)
参数说明:
- img:待处理的输入图像
- x:沿X轴方向移动的像素数量
- y:沿Y轴方向移动的像素数量
代码运行注意事项:
请确保图片文件路径中不包含中文字符,以免导致读取失败。
OpenCV读取图像默认采用BGR格式,而Matplotlib显示图像期望RGB格式。因此,代码中使用img[:,:,::-1]进行通道翻转,以正确显示彩色图像。
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()

2.2 图像缩放处理
在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()

2.3 图像旋转功能
OpenCV原生旋转依赖仿射变换,而imutils提供了imutils.rotate()函数,接收图像数据和旋转角度两个参数,默认执行逆时针旋转。此外,imutils模块还提供了rotate_round()方法,用于执行顺时针旋转。
具体函数调用如下:
逆时针旋转示例
rotated = imutils.rotate(image, 90)
顺时针旋转示例
rotated_round = imutils.rotate_bound(image, 90)
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()

2.4 骨架提取(边缘细化)
骨架提取旨在构建图像中物体的拓扑骨架(topological skeleton),常用于图像细化处理。
imutils提供的实现方法为skeletonize()。
该方法的第二个参数为结构元素尺寸(structuring element),相当于处理粒度。粒度值越小,处理耗时越长。实验中可选用(3,3)或(7,7)等尺寸。
需注意,并非所有图像都适合进行骨架提取,例如部分复杂图案(如示例中的哆啦A梦)可能无法生成有效骨架。
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()

2.5 格式转换与Matplotlib显示
在OpenCV的Python绑定中,图像以NumPy数组形式按BGR顺序存储。cv2.imshow函数对此处理良好,但plt.imshow函数假设图像按RGB顺序排列。为解决此兼容性问题,可调用cv2.cvtColor进行格式转换,或使用opencv2matplotlib便捷功能直接处理。
img = cv.imread("lion.jpeg")
plt.figure()
plt.imshow(imutils.opencv2matplotlib(img))
2.6 OpenCV版本检测
OpenCV 4发布后,版本更新带来的向后兼容性问题日益突出。使用OpenCV时,建议先检查当前环境版本以调用合适的函数。imutils中的is_cv2()、is_cv3()和is_cv4()功能可用于自动检测当前OpenCV版本,简化版本适配工作。
print("OPenCV版本: {}".format(cv2.__version__))
本文介绍了Python imutils库的基本概念与使用方法,更多相关技术内容可参考本站其他文章或持续关注后续更新,感谢支持。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













