参考:http://geojson.io(geojson直接显示)
两个主要函数说明:
1. 像素点转为 polygon 填充
将带经纬度的 polygon 矢量数据转为指定像素点的栅格数据。
方法如下:
-
首先通过计算原始 geotiff 数据的每个像素点对应的经纬度偏移
-
获取左上角经纬度
-
通过相对值,可以获取 polygon 的每个顶点对应的相对像素点
-
然后通过 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()