zoukankan      html  css  js  c++  java
  • 【614】矢量数据转栅格数据(cv2.fillPoly/cv2.polylines)

    参考:http://geojson.io(geojson直接显示)

    参考:geojson、shp文件互转

    参考:cv2.fillConvexPoly()与cv2.fillPoly()填充多边形

    参考:GeoJSON格式规范说明

    两个主要函数说明:

    cv2.fillPoly()

    cv2.polylines()

    1. 像素点转为 polygon 填充

      将带经纬度的 polygon 矢量数据转为指定像素点的栅格数据。

      方法如下:

    • 首先通过计算原始 geotiff 数据的每个像素点对应的经纬度偏移

    • 获取左上角经纬度

    • 通过相对值,可以获取 polygon 的每个顶点对应的相对像素点

    • 然后通过 cv2.fillPoly() 函数可以实现矢量转栅格

    • 参考:cv2.fillConvexPoly()与cv2.fillPoly()填充多边形

    • cv2.fillConvexPoly 与 cv2.fillPoly 的区别就在于,前者针对一个凸包,后者可以针对多个凸包,因此后者是需要传入凸包的 list,前者则只有一个

    • 通过 Image.fromarray() 将数组转为图像,然后通过 .save() 可以直接保存为图片格式

    举例:

    import matplotlib.pyplot as plt
    
    hull_arr = np.zeros((20, 20, 3), np.uint8)
    cv2.fillConvexPoly(hull_arr, np.array([[4, 4], [15, 4], [15, 15], [4, 15]]), (255, 255, 255))
    
    plt.imshow(hull_arr)
    plt.show()
    
    hull_arr = np.zeros((20, 20, 3), np.uint8)
    cv2.fillPoly(hull_arr, [np.array([[4, 4], [10, 4], [15, 15], [4, 15]])], (255, 255, 255))
    
    plt.imshow(hull_arr)
    plt.show()
    
    Image.fromarray(hull_arr).save("2.jpg")
    

    或者生成灰度图:

    hull_arr = np.zeros((20, 20), np.uint8)
    cv2.fillConvexPoly(hull_arr, np.array([[4, 4], [15, 4], [15, 15], [4, 15]]), [255])
    
    plt.imshow(hull_arr)
    plt.show()
    
    hull_arr = np.zeros((20, 20), np.uint8)
    cv2.fillPoly(hull_arr, [np.array([[4, 4], [10, 4], [15, 15], [4, 15]])], [255])
    
    plt.imshow(hull_arr)
    plt.show()
    
    Image.fromarray(hull_arr, mode="L").save("2.jpg")

      需要注意的是,如果 polygon 之间存在相交的情况,fillPoly 会删掉重叠部分。

    import numpy as np 
    import cv2 
    import matplotlib.pyplot as plt 
    
    hull_arr = np.zeros((1000, 1000), np.uint8)
    
    cv2.fillPoly(hull_arr, 
                 [np.array([[100, 100], [900, 40], [900, 900], [100, 900]]),
                  np.array([[400, 400], [950, 400], [950, 950], [400, 950]])], 
                 color=255)
    
    plt.imshow(hull_arr)
    plt.show()
    

      不过可以通过单一遍历每一个 polygon,实现重叠显示。

    import numpy as np 
    import cv2 
    import matplotlib.pyplot as plt 
    
    hull_arr = np.zeros((1000, 1000), np.uint8)
    polys = [np.array([[100, 100], [900, 40], [900, 900], [100, 900]]),
             np.array([[400, 400], [950, 400], [950, 950], [400, 950]])]
    
    def fillPolyNoHoles(hull_arr, polys):
        for i in range(len(polys)):
            cv2.fillPoly(hull_arr,
                         [polys[i]],
                         color=255)
        return hull_arr
    
    hull_arr = fillPolyNoHoles(hull_arr, polys) 
    
    plt.imshow(hull_arr)
    plt.show()
    

     

      通过不同的颜色设置,可以实现不同的切除操作。

    import numpy as np 
    import cv2 
    import matplotlib.pyplot as plt 
    
    hull_arr = np.zeros((1000, 1000), np.uint8)
    
    cv2.fillPoly(hull_arr, 
                 [np.array([[100, 100], [900, 40], [900, 900], [100, 900]])], 
                 color=255)
    
    cv2.fillPoly(hull_arr, 
                 [np.array([[400, 400], [950, 400], [950, 950], [400, 950]])], 
                 color=0)
    
    plt.imshow(hull_arr)
    plt.show()
    

     

    2. 像素点转为 Polylines

    参考:Python OpenCV – cv2.polylines() method

      举例:

    import numpy as np 
    import cv2 
    import matplotlib.pyplot as plt 
    
    hull_arr = np.zeros((1000, 1000, 3), np.uint8)
    
    cv2.polylines(hull_arr, 
                  [np.array([[100, 100], [900, 40], [900, 900], [100, 900]])], 
                  isClosed=True, 
                  color=(255, 255, 0), 
                  thickness=10)
    
    plt.imshow(hull_arr)
    plt.show()
    

    import numpy as np 
    import cv2 
    import matplotlib.pyplot as plt 
    
    hull_arr = np.zeros((1000, 1000, 3), np.uint8)
    
    cv2.fillPoly(hull_arr, 
                 [np.array([[100, 100], [900, 40], [900, 900], [100, 900]])], 
                 (255, 255, 255))
    
    cv2.polylines(hull_arr, 
                  [np.array([[100, 100], [900, 40], [900, 900], [100, 900]])], 
                  isClosed=True, 
                  color=(0, 0, 0), 
                  thickness=30)
    
    cv2.polylines(hull_arr, 
                  [np.array([[100, 100], [900, 40], [900, 900], [100, 900]])], 
                  isClosed=True, 
                  color=(255, 255, 0), 
                  thickness=10)
    
    plt.imshow(hull_arr)
    plt.show()

  • 相关阅读:
    shiro实战系列(三)之架构
    shiro实战系列(二)之入门实战续
    ShopNC B2B2C多用户商城2014商业版,带微商城
    开源 SHOPNC B2B2C结算营运版 wap IM客服 API 手机app 短信通知
    PHP5.3下加速器ZendGuardLoader安装 (LNMP/lnmpa)
    XAMPP + Xdebug+Zend Studio
    magento 12 配置安装教程
    C#控件一览表
    GetXamarin.xambe
    新建电子监控点与测速点
  • 原文地址:https://www.cnblogs.com/alex-bn-lee/p/15032295.html
Copyright © 2011-2022 走看看