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只是业余爱好,但它的强大魅力跟语言特性已经慢慢走近了我的工作,虽不能深入学习,但在工作中可以写一些工具还是杠杠的!

 

 

 

 

 

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