这是我的配方,而且它的效果相当不错。
import skimage
import gdal
import matplotlib.pyplot as plt
import numpy as np
import rasterio
import shapely
import fiona
image=gdal.Open('A.tif')
im=image.ReadAsArray()
out=skimage.measure.find_contours(im,0.5)
fig, ax = plt.subplots()
ax.imshow(im, cmap=plt.cm.gray)
cs=[]
for contour in out:
cs.append(ax.plot(contour[:, 1], contour[:, 0], linewidth=2))
ax.axis('image')
plt.show()
with rasterio.open('A.tif') as raster:
image = raster.read()[0,:,:]
from shapely.geometry import mapping,MultiLineString,LineString
poly=[]
for i in cs:
x=i[0].get_xdata()
y=i[0].get_ydata()
aa=rasterio.transform.xy(raster.transform,y,x)
poly.append(LineString([(i[0], i[1]) for i in zip(aa[0],aa[1])]))
list_lstrings = [shapely.wkt.loads(p.wkt) for p in poly]
mult=shapely.geometry.MultiLineString(list_lstrings)
from fiona.crs import from_epsg
crs = from_epsg(4326)
schema = {
'geometry': 'MultiLineString',
'properties': {'id': 'int'},
}
with fiona.open('U:\\new_shape.shp', 'w', 'ESRI Shapefile', schema,crs=crs) as c:
c.write({
'geometry': mapping(mult),
'properties': {'id': 1},
})
mask
是一个布尔数组吗?如果是的话,可能有一种更直接的方法可以得到您要寻找的结果。 - jdmcbrmask
是一个布尔数组(通过阈值处理得到)。 - Cate