今早天氣不咋地,不出太陽也就算了還下着雨,可能是出於興趣吧,抽空來學習學習最近比較熱門的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只是業餘愛好,但它的強大魅力跟語言特性已經慢慢走近了我的工作,雖不能深入學習,但在工作中可以寫一些工具還是槓槓的!