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自行學習查看,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/350750.html
標籤:其他
