Python和imutils獲取圖片的鳥瞰圖

    今早天氣不咋地,不出太陽也就算了還下着雨,可能是出於興趣吧,抽空來學習學習最近比較熱門的Python!題外話說完了,進入正題!

    在學習python時無意中發現了一個軟件包 imutils ,它爲我們提供了非常方便的圖像處理函數,可以說是對OpenCV的簡化,這裏就不對他做詳細介紹了,如果想了解更過就進github裏面自行學習吧!下面闡述我從imutils教程中學到的內容,如果你還沒安裝imutils,那麼你可以通過pip來安裝:pip install imutils

先給大家看看我執行後的效果圖:

    

我在這裏補充一個輪廓圖給大家參考:

效果是不是還不錯呢?那就不多說了來看看代碼吧!

from imutils import perspective
from skimage.filters import threshold_local
import cv2
import imutils

# 邊緣掃描
image = cv2.imread("./picture/5.png")
ratio = image.shape[0] / 500.0                                 # 比例
orig = image.copy()
image = imutils.resize(image, height = 500)

# 灰度轉換及邊緣查找
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (5, 5), 0)
edged = cv2.Canny(gray, 75, 200)                               # 邊緣檢測

# 只保留輪廓
cnts = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)#通過邊緣圖像找到輪廓
cnts = cnts[0] if imutils.is_cv2() else cnts[1]                # 用以區分OpenCV2.4和OpenCV3
cnts = sorted(cnts, key = cv2.contourArea, reverse = True)[:5] # 保留最大輪廓

for c in cnts:
    peri = cv2.arcLength(c, True)
    approx = cv2.approxPolyDP(c, 0.02 * peri, True)            # 輪廓點    
    if len(approx) == 4:                                       # 表明找到四個輪廓點
        screenCnt = approx
        break
    
# 轉爲鳥瞰圖
warped = perspective.four_point_transform(orig, screenCnt.reshape(4, 2) * ratio)
warped = cv2.cvtColor(warped, cv2.COLOR_BGR2GRAY)              # 灰度轉換
T = threshold_local(warped, 11, offset = 10, method = "gaussian")
warped = (warped > T).astype("uint8") * 255

cv2.imshow("Original", imutils.resize(orig, height = 650))
cv2.imshow("Scanned", imutils.resize(warped, height = 650))
cv2.waitKey(0)

是不是發現很簡單呢?(這裏我就不對代碼進行詳細的解釋了,裏面已做了註釋。)那都是得益於imutils這個包,這裏用到的four_point_transform函數進行輪廓的捕捉,並執行變形轉換,可以說幾乎所有繁重的工作都包含在了這個函數裏面。

        作爲剛接觸python幾天的新人,希望大家在發現什麼的問題後能跟我共同討論,共同進步,雖然python只是業餘愛好,但它的強大魅力跟語言特性已經慢慢走近了我的工作,雖不能深入學習,但在工作中可以寫一些工具還是槓槓的!

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章