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

相关推荐
詩筠4 小时前
SpringBoot实战:轻松实现XSS攻击防御(注解和过滤器)
java·spring boot·后端·xss
fengzhuzhigu5 小时前
Go源码--channel源码解读
开发语言·后端·golang
AskHarries5 小时前
Spring Boot集成jacoco实现单元测试覆盖统计
java·spring boot·后端
全职计算机毕业设计5 小时前
基于springboot的工作绩效管理系统的设计与实现+文档
java·spring boot·后端
Mero技术博客6 小时前
第四节:如何使用注解方式从IOC中获取bean(自学Spring boot 3.x的第一天)
java·spring boot·后端·spring·微服务
花花鱼6 小时前
spring boot (shiro)+ websocket测试连接不上的简单检测处理
java·spring boot·后端
人才程序员6 小时前
【Rust入门】猜数游戏
开发语言·c++·后端·单片机·游戏·rust·c
人才程序员7 小时前
【Rust入门】生成随机数
开发语言·数据库·后端·单片机·rust
uccs7 小时前
go 中一些其他的用法
后端·go
y5236488 小时前
ASP.NET Core 使用Log4net
后端·asp.net