Python和imutils获取图片的鸟瞰图

今早天气不咋地,不出太阳也就算了还下着雨,但这绝对无法影响我学习python的热情,于是我下了床,开始了战斗模式!题外话说完了,进入正题!

    在学习python时无意中发现了一个软件包 imutils ,它为我们提供了非常方便的图像处理函数,可以说是对OpenCV的简化,这里就不对他做详细介绍了,如果想了解更过就进github里面自行学习吧!如果你还没安装imutils,那么你可以通过pip来安装:pip install imutils

    先给大家看看我执行后的效果图:    

效果是不是还不错呢?那就不多说了来看看代码吧!

  1. from imutils import perspective
  2. from skimage.filters import threshold_local
  3. import cv2
  4. import imutils
  5. # 边缘扫描
  6. image = cv2.imread( "./picture/5.png")
  7. ratio = image.shape[ 0] / 500.0                                 # 比例
  8. orig = image.copy()
  9. image = imutils.resize(image, height = 500)
  10. # 灰度转换及边缘查找
  11. gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  12. gray = cv2.GaussianBlur(gray, ( 5, 5), 0)
  13. edged = cv2.Canny(gray, 75, 200)                         # 边缘检测
  14. # 只保留轮廓
  15. cnts = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) #通过边缘图像找到轮廓
  16. cnts = cnts[ 0] if imutils.is_cv2() else cnts[ 1]            # 用以区分OpenCV2.4和OpenCV3
  17. cnts = sorted(cnts, key = cv2.contourArea, reverse = True)[: 5] # 保留最大轮廓
  18. for c in cnts:
  19. peri = cv2.arcLength(c, True)
  20. approx = cv2.approxPolyDP(c, 0.02 * peri, True)         # 轮廓点
  21. if len(approx) == 4:                                        # 表明找到四个轮廓点
  22. screenCnt = approx
  23. break
  24. # 转为鸟瞰图
  25. warped = perspective.four_point_transform(orig, screenCnt.reshape( 4, 2) * ratio)
  26. warped = cv2.cvtColor(warped, cv2.COLOR_BGR2GRAY)         # 灰度转换
  27. T = threshold_local(warped, 11, offset = 10, method = "gaussian")
  28. warped = (warped > T).astype( "uint8") * 255
  29. cv2.imshow( "Original", imutils.resize(orig, height = 650))
  30. cv2.imshow( "Scanned", imutils.resize(warped, height = 650))
  31. cv2.waitKey( 0)
是不是发现很简单呢?(这里我就不对代码进行详细的解释了,里面已做了注释。)那都是得益于imutils这个包,这里用到的four_point_transform函数进行轮廓的捕捉,并执行变形转换,可以说几乎所有繁重的工作都包含在了这个函数里面。
        作为刚接触python几天的菜鸟,希望大家在发现什么的问题后能跟我共同讨论,共同进步,在几年后走上人生巅峰,迎娶白富美哈哈哈哈!


猜你喜欢

转载自blog.csdn.net/wangkai677612/article/details/80855378