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

相关推荐
计算机毕设指导635 分钟前
基于Springboot学生宿舍水电信息管理系统【附源码】
java·spring boot·后端·mysql·spring·tomcat·maven
计算机-秋大田42 分钟前
基于Spring Boot的兴顺物流管理系统设计与实现(LW+源码+讲解)
java·vue.js·spring boot·后端·spring·课程设计
羊小猪~~2 小时前
MYSQL学习笔记(九):MYSQL表的“增删改查”
数据库·笔记·后端·sql·学习·mysql·考研
豌豆花下猫2 小时前
Python 潮流周刊#90:uv 一周岁了,优缺点分析(摘要)
后端·python·ai
橘猫云计算机设计3 小时前
基于SSM的《计算机网络》题库管理系统(源码+lw+部署文档+讲解),源码可白嫖!
java·数据库·spring boot·后端·python·计算机网络·毕设
熬夜苦读学习3 小时前
Linux文件系统
linux·运维·服务器·开发语言·后端
坚定信念,勇往无前4 小时前
Spring Boot 如何保证接口安全
spring boot·后端·安全
程序员侠客行5 小时前
Spring事务原理详解 三
java·后端·spring·架构
Hello.Reader6 小时前
深入理解 Rust 的 `Rc<T>`:实现多所有权的智能指针
开发语言·后端·rust
yoona10206 小时前
Rust编程语言入门教程(八)所有权 Stack vs Heap
开发语言·后端·rust·区块链·学习方法