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多平台发布

相关推荐
雨中飘荡的记忆19 小时前
OpenClaw:开源AI助手平台的革命之路
后端
程序员鱼皮19 小时前
GitHub 关注突破 2w,我总结了 10 个涨星涨粉技巧!
前端·后端·github
用户2986985301419 小时前
程序员效率工具:Spire.Doc如何助你一键搞定Word表格排版
后端·c#·.net
爱分享的鱼鱼19 小时前
Spring Boot服务中添加字段的完整指南
后端
掘金者阿豪19 小时前
数据库选型的“第三维度”:为什么我们开始重新思考技术栈的底层逻辑
后端
SelectDB19 小时前
Doris & SelectDB for AI 实操:从零搭建非结构化数据智能分析洞察系统
后端
用户8493596105319 小时前
OGORM 新手入门笔记
后端
BigTopOne19 小时前
【open gl】基本api方法
后端
lizhongxuan20 小时前
AI Agent 的一体化沙盒环境
后端
祈安_20 小时前
C语言内存函数
c语言·后端