问题描述:
我们需要把一个二分类的数据集(建筑物和背景),转换成一个二分类的数据集(建筑物边缘和背景),用于制作边缘提取网络的数据集。
转换效果如下图所示:
左半部分是未经转换的图片,右半部分是经过代码转换得到的图片
函数的主要思想:
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)