imutils包

imutils是Adrian Rosebrock开发的一个python工具包,它整合了opencv、numpy和matplotlib的部分操作,使这些操作更加简便快捷。今天我们将对它的部分功能进行介绍,以便大家在今后的学习工作中,能够灵活运用好imutils包。

安装

当我们的python环境中已经装有 NumPy、SciPy、Matplotlib 和 OpenCV,那么可以直接使用下面的命令行来进行安装。

复制代码
pip install imutils
# conda install imutils

按名称查找函数 OpenCV 函数

OpenCV库很大,拥有许多函数,当我们刚开始接触时,可能无法快速找到需要的函数。imutils模块提供了一个find_function方法让我们可以跨模块(以及可选的子模块)的快速搜索函数名称,以找到要查找的函数。

复制代码
imutils.find_function("border")
print('*'*10)
imutils.find_function("contour")

1. BORDER_CONSTANT
2. BORDER_DEFAULT
3. BORDER_ISOLATED
4. BORDER_REFLECT
5. BORDER_REFLECT101
6. BORDER_REFLECT_101
7. BORDER_REPLICATE
8. BORDER_TRANSPARENT
9. BORDER_WRAP
10. borderInterpolate
11. copyMakeBorder
**********
1. CONTOURS_MATCH_I1
2. CONTOURS_MATCH_I2
3. CONTOURS_MATCH_I3
4. contourArea
5. drawContours
6. findContours
7. isContourConvex

而后可以通过cv2.xxx(查找到的函数名)来使用需要的函数。

平移

在opencv中,当你需要移动图像,你可以使用cv2.warpAffine函数,但是cv2.warpAffine函数在实现平移功能是需要构建变换矩阵,然后利用仿射变换实现平移。而在imutils中提供了imutils.translate(img,x,y) 函数可以直接实现图像的平移。

复制代码
rows, cols, channels = img.shape
M = np.float32([[1,0,100],[0,1,50]])
img_warpAffine = cv2.warpAffine(img,M,(cols, rows))
img_imutils = imutils.translate(img,100,50)
plt.figure(figsize=(15,5))
plt.subplot(131)
plt.imshow(img[:,:,::-1])  # img[:,:,::-1]转换是为了转回RGB格式,这样才可以正常显示彩色图像
plt.title('ariginal'), plt.axis('off')
plt.subplot(132)
plt.imshow(img_warpAffine[:,:,::-1])
plt.title('warpAffine'), plt.axis('off')
plt.subplot(133)
plt.imshow(img_imutils[:,:,::-1])
plt.title('imutils'), plt.axis('off')
plt.savefig('imulits_translate.jpg')
plt.show()

旋转

在OpenCV中旋转图像是通过调用cv2.getRotationMatrix2D和cv2.warpAffine来完成的。在使用过程中需要提供旋转中心等参数。imutils提供了rotate函数来实现更便捷的旋转图像。

复制代码
rows,cols=img.shape[:2]
#第一个参数是旋转中心,第二个参数是旋转角度,第三个因子是旋转后的缩放因子
M=cv2.getRotationMatrix2D((cols/2,rows/2),75,1)
# 第三个参数是输出图像的尺寸中心,图像的宽和高
cv_rorated = cv2.warpAffine(img,M,(cols,rows))

imutils_rotated = imutils.rotate(img, angle=75)

plt.figure(figsize=(15,5))
plt.subplot(131)
plt.imshow(img[:,:,::-1]) plt.title('ariginal'), plt.axis('off')
plt.subplot(132)
plt.imshow(cv_rorated[:,:,::-1])
plt.title('cv_rorated'), plt.axis('off')
plt.subplot(133)
plt.imshow(imutils_rotated[:,:,::-1])
plt.title('imutils_rotated'), plt.axis('off')
plt.savefig('imulits_totated.jpg')
plt.show()

调整大小

在opencv中调整图像大小使用的是cv2.resize(img,size)的方法,但当我们需要保持宽高比的缩放时,cv2.resize还需要计算缩放后的宽高比,以便保持一致。而在imutils中同样提供了resize 方法,只需提供宽或者高,就能实现保持宽高比的缩放。一般如果有width参数,就会安装width参数进行缩放,不会理会height参数,如果两个参数不成比例,也是安装width进行缩放。

复制代码
img.shape # (600,800,3)
resized1= imutils.resize(img,width=400)# 指定宽度,会自动计算相应比例高度,还有参数height
resized2 = imutils.resize(img,height=200)
print(resized1.shape,resized2.shape) # (300, 400, 3) (200, 266, 3)

plt.figure(figsize=(15,5))
plt.subplot(131)
plt.imshow(img[:,:,::-1])
plt.title('original')
plt.subplot(132)
plt.imshow(resized1[:,:,::-1])
plt.title('imutils_resized1')
plt.subplot(133)
plt.imshow(resized2[:,:,::-1])
plt.title('imutils_resized2')
plt.savefig("imutils_resized.jpg")
plt.show()

转RGB

在opencv中,读入的图像通道顺序为BGR,当我们使用cv2.imshow时,不会有显示问题,但当我们要使用matplotlib时,plt.imshow会假定读入的图像顺序为RGB。opencv提供了cv2.COLOR_BGR2RGB 函数将图像格式转为RGB。同样,imutils提供了opencv2matplotlib函数来解决这一问题。

复制代码
plt.figure(figsize=(10,5))
plt.subplot(131)
plt.imshow(img)
plt.title('original'),plt.axis('off')
plt.subplot(132)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.title('cv_rgb'),plt.axis('off')
plt.subplot(133)
plt.imshow(imutils.opencv2matplotlib(img))
plt.title('imutils_rgb'),plt.axis('off')
plt.savefig("imutils_rgb.jpg")
plt.show()

列出图像路径

在imutils中提供了一个paths子模块,它可以基于根目录递归的查找根目录下的图像,并返回图像路径,数据类型为str。

复制代码
from imutils import paths

for imagePath in paths.list_images("./"): 
print (imagePath)

./cat.jpg
./dog.jpg
./disney.jpg
./imutils_resized.jpg
./01image\river.jpg
./01image\river1.jpg
./01image\river2.jpg
./02image\zoo.jpg

总结

在本篇文章中,我们学习了方便简单的imutils包,除了上述功能外,它还有很多使用功能,感兴趣的读者可以去https://github.com/PyImageSearch/imutils自行学习查看。

本文由mdnice多平台发布

相关推荐
Avan_菜菜6 小时前
使用 Docker + rclone 自建 WebDAV
后端·agent·claude
阳光是sunny8 小时前
别再被 worktree 绕晕了!AI 编程时代你必须掌握的 Git 隔离神器
前端·人工智能·后端
万少9 小时前
万少的博客 - 技术分享与解决方案
前端·javascript·后端
咖啡八杯9 小时前
GoF设计模式——备忘录模式
java·后端·spring·设计模式
苍何9 小时前
腾讯再放大招,企微 Agent 大圆开启内测
后端
ethantan9 小时前
一篇讲解AI Agent 组成:像人一样思考的智能体
人工智能·后端·程序员
Cosolar11 小时前
vLLM 生产级部署完全指南
人工智能·后端·架构
IT_陈寒12 小时前
垃圾回收器选错了,我的Java服务内存炸了
前端·人工智能·后端
用户83562907805113 小时前
使用 Python 在 PDF 中创建与管理书签
后端·python
Nturmoils13 小时前
字段太多看不全,ksql 的展开模式和输出控制怎么用
数据库·后端