HED、RCF网络数据集制作------二值图提取类别的内边界

问题描述:

我们需要把一个二分类的数据集(建筑物和背景),转换成一个二分类的数据集(建筑物边缘和背景),用于制作边缘提取网络的数据集。

转换效果如下图所示:

左半部分是未经转换的图片,右半部分是经过代码转换得到的图片

 

HED、RCF网络数据集制作------二值图提取类别的内边界_第1张图片

函数的主要思想:

1)先按照行扫描,如果位于某位置为建筑物(此处建筑物的像素值为255),且其左边或者右边相邻的像素为背景(此处为0),则此位置为建筑物的边缘。

2)同上,进行列扫描

3)把所有的是边界的像素值赋值为255,其他位置的像素为0

由此,得到建筑物的内边界。内边界是指提取出来的是边界,该该圈像素全部属于建筑物。(注意:代码中未考虑位于整张图片的边缘处的像素。即全部当作背景处理)

函数功能描述:把某个文件夹下的某种格式的图片转化成边界图,并存进另外一个文件夹。

基于python3,openCV,numpy

import numpy as np
import cv2
import os
def face2line(dirFile,suffix,newDirFile):
    '''把dirFile文件夹下的类别图转化成边界图
    dirFile:指定的被转化的图片所在的文件夹
    suffix:图片类型,如“tif"
    newDirFile:转化出来的图片所要存的文件夹
    '''
    if(os.path.exists(newDirFile)==False):
        os.mkdir(newDirFile)
    for file in os.listdir(dirFile):
        singleFileName=dirFile+"\\"+file
        singlefileForm = os.path.splitext(singleFileName)[1][1:]
        if(singlefileForm == suffix):
            print('loading................ : ',singleFileName)
            img=cv2.imread(singleFileName,0)
            edge=np.zeros((img.shape[0],img.shape[1]))
            for i in range(1,img.shape[0]-1):
                for j in range(1,img.shape[1]-1):
                    #if (img[i,j]==255&img[i+1,j]==0)|(img[i,j]==255&img[i-1,j]==0):
                    if (img[i,j]==255 and img[i+1,j]==0) or(img[i,j]==255 and img[i-1,j]==0):
                        edge[i,j]=255
                    if (img[i,j]==255 and img[i,j+1]==0) or(img[i,j]==255 and img[i,j-1]==0):
                        edge[i,j]=255
            cv2.imwrite(newDirFile+"\\"+file,edge)
dirFile="D:\\pycharm\\building0_3m\\AerialImageDataset\\train\\gt"
suffix="tif"
newDirFile="D:\\pycharm\\building0_3m\\AerialImageDataset\\train\\gt_line"
face2line(dirFile,suffix,newDirFile)

 

 

 

 

你可能感兴趣的:(遥感影像分类)