利用深度学习提取出道路二值图后,二值图有坐标信息,也就是栅格图有坐标,怎么转线状shape保留坐标信息?目前先提取中心线后转矢量坐标信息丢失,请问怎么解决?
3条回答 默认 最新
- 影醉阏轩窗 2021-08-03 11:29关注本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报动七七 2021-08-04 01:23
你好,先用这一段转中心线
def ext_road(path, outfilename="r1.tif"): '''影像道路提取中心线,同级目录输出文件 :param path: 输入栅格文件路径 :param outfilename: 输出栅格文件名 ''' # 读取灰度图片,并显示 img = cv2.imread(path, 0) # 直接读为灰度图像 img[img == 255] = 1 skeleton0 = morphology.skeletonize(img) skeleton = skeleton0.astype(np.uint8) * 255 # cv2.imshow('image', skeleton) # cv2.waitKey(0) filepath = os.path.dirname(path) + "\\" + outfilename cv2.imwrite(filepath, skeleton) 然后是这些转shape时发现没有坐标 ```python def get_contour(img): """获取连通域 :param img: opencv读取的图片数组 :return: 连通域(拐点坐标) """ # 灰度化, 二值化, 连通域分析 img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, img_bin = cv2.threshold(img_gray, 1, 255, cv2.THRESH_BINARY) contours, hierarchy = cv2.findContours(img_bin, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) return img_gray, contours def rasterToLine(path, shpPath): '''栅格转为矢量线 :param path: 输入栅格文件路径 :param shpPath: 输出要素文件路径 ''' # 1.导入图片 img_src = cv2.imread(path) # 2.获取连通域 img_gray, contours = get_contour(img_src) # 创建线要素 # driver = ogr.GetDriverByName('ESRI Shapefile') # dataSource=driver.CreateDataSource(path) # layer =dataSource.CreateLayer("line1") # fieldDefn = ogr.FieldDefn('id', ogr.OFTString) # fieldDefn.SetWidth(4) # layer.CreateField(fieldDefn) gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO") # 为了支持中文路径 gdal.SetConfigOption("SHAPE_ENCODING", "CP936") # 为了使属性表字段支持中文 strVectorFile = shpPath # 定义写入路径及文件名 ogr.RegisterAll() # 注册所有的驱动 strDriverName = "ESRI Shapefile" # 创建数据,这里创建ESRI的shp文件 oDriver = ogr.GetDriverByName(strDriverName) if oDriver == None: print("%s 驱动不可用!\n", strDriverName) oDS = oDriver.CreateDataSource(strVectorFile) # 创建数据源 if oDS == None: print("创建文件【%s】失败!", strVectorFile) srs = osr.SpatialReference() # 创建空间参考 srs.ImportFromEPSG(4326) # 定义地理坐标系WGS1984 papszLCO = [] # 创建图层,创建一个线图层,"TestPolygon"->属性表名 oLayer = oDS.CreateLayer("Testline", geom_type=ogr.wkbLineString) if oLayer == None: print("图层创建失败!\n") '''下面添加矢量数据,属性表数据、矢量数据坐标''' oFieldID = ogr.FieldDefn("FieldID", ogr.OFTInteger) # 创建一个叫FieldID的整型属性 oLayer.CreateField(oFieldID, 1) oFieldName = ogr.FieldDefn("FieldName", ogr.OFTString) # 创建一个叫FieldName的字符型属性 oFieldName.SetWidth(100) # 定义字符长度为100 oLayer.CreateField(oFieldName, 1) oDefn = oLayer.GetLayerDefn() # 定义要素 # lines = ogr.Geometry(ogr.wkbLinearRing) # 定义总的线集 # 创建一条线 oFeature = ogr.Feature(oDefn) oFeature.SetField(0, 0) # 第一个参数表示第几个字段,第二个参数表示字段的值 oFeature.SetField(1, "line1") for contour in contours: box1 = ogr.Geometry(ogr.wkbLinearRing) for point in contour: x_col = float(point[0, 1]) y_row = float(point[0, 0]) box1.AddPoint(y_row, -x_col) oFeature.SetGeometry(box1) oLayer.CreateFeature(oFeature) ring = ogr.Geometry(ogr.wkbLinearRing) # 创建WKT 文本点 for i in range(10): wkt = "LINESTRING(%f %f,%f %f)" % ( float(0), float(1000+i*10), float(1000), float(1000+i*10)) # 生成实体点 point = ogr.CreateGeometryFromWkt(wkt) oFeature.SetGeometry(point) oFeature.SetGeometry(ring) oLayer.CreateFeature(oFeature) oFeature = None oDS = None
```
赞回复动七七 2021-08-04 01:24刚才那条回复格式不对,上面那一段不是提中心线是转shape的,下面这个是提中心线
def ext_road(path, outfilename="r1.tif"): '''影像道路提取中心线,同级目录输出文件 :param path: 输入栅格文件路径 :param outfilename: 输出栅格文件名 ''' # 读取灰度图片,并显示 img = cv2.imread(path, 0) # 直接读为灰度图像 img[img == 255] = 1 skeleton0 = morphology.skeletonize(img) skeleton = skeleton0.astype(np.uint8) * 255 # cv2.imshow('image', skeleton) # cv2.waitKey(0) filepath = os.path.dirname(path) + "\\" + outfilename cv2.imwrite(filepath, skeleton)
赞回复