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自行学习查看。