动七七 2021-08-03 08:32 采纳率: 86.7%
浏览 45
已结题

利用深度学习提取出道路二值图后,怎么转线状shape保留坐标信息?

利用深度学习提取出道路二值图后,二值图有坐标信息,也就是栅格图有坐标,怎么转线状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)
    
    
    

    回复
查看更多回答(2条)
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 8月23日
  • 已采纳回答 8月16日
  • 创建了问题 8月3日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部