基于SegNet和U-Net的遥感图像语义分割(一)
程序员文章站
2024-03-19 16:51:16
...
**基于SegNet和U-Net的遥感图像语义分割(一)**
代码:
https://github.com/AstarLight/Satellite-Segmentation
数据集
链接:https://pan.baidu.com/s/1ajdS8ZRKY4ihrn0sf-2q2w
提取码:i4wr
解压后得到3个文件,如下所示:
接下来介绍如何对原数据集(unet_buildings)进行处理,处理函数为./unet/gen_dataset.py
src_img = cv2.imread('./data/src/' + image_sets[i]) # 3 channels
label_img = cv2.imread('./data/label/' + image_sets[i],cv2.IMREAD_GRAYSCALE)#single channel
X_height,X_width,_ = src_img.shape
其中单通道的Lable影像看上去是黑色的,其实不然。那是由于像素值的区间范围在0~4之间,看不出区别。但是可以通过专业软件看图,如Arcgis软件(对于它的说明,我的博客中有介绍):
random_width = random.randint(0, X_width - img_w - 1)
random_height = random.randint(0, X_height - img_h - 1)
src_roi = src_img[random_height: random_height + img_h, random_width: random_width + img_w,:]
label_roi = label_img[random_height: random_height + img_h, random_width: random_width + img_w]
我们现在拥有的是5张大尺寸的遥感图像,我们不能直接把这些图像送入网络进行训练,因为内存承受不了而且他们的尺寸也各不相同。因此,我们首先将他们做随机切割,切割的思想是,在红色框内随机生成x,y坐标(红点)作为切割小图(黄色框)的左上角位置。
然后对切割出来的256*256小图,做以下数据增强操作:
- 原图和label图都需要旋转:90度,180度,270度
def rotate(xb,yb,angle):
#cv2.getRotationMatrix2D(),这个函数需要三个参数,旋转中心,旋转角度,旋转后图像的缩放比例
M_rotate = cv2.getRotationMatrix2D((img_w/2, img_h/2), angle, 1)
#cv2.warpAffine()仿射变换,参数src - 输入图像 M - 变换矩阵(一般反映平移或旋转的关系) dsize - 输出图像的大小 flags - 插值方法的组合 。。。
xb = cv2.warpAffine(xb, M_rotate, (img_w, img_h))
yb = cv2.warpAffine(yb, M_rotate, (img_w, img_h))
return xb,yb
- 原图和label图都需要做沿y轴的镜像操作
if np.random.random() < 0.25:
# cv2.flip(),第二个参数:1水平翻转 0垂直翻转 -1水平垂直翻转
xb = cv2.flip(xb, 1)
yb = cv2.flip(yb, 1)
- 原图做模糊操作
def blur(img):
# cv2.blur(均值滤波),参数说明:img表示输入的图片, (3, 3) 表示进行均值滤波的方框大小
# 均值滤波是用每个像素和它周围像素计算出来的平均值替换图像中每个像素
img = cv2.blur(img, (3, 3));
return img
- 原图做光照调整操作
在某些情况下,一副图像中大部分像素的强度都集中在某一区域,而质量较高的图像中,像素的强度应该均衡的分布。为此,可将表示像素强度的直方图进行拉伸,将其平坦化。如下:
def gamma_transform(img, gamma):
gamma_table = [np.power(x / 255.0, gamma) * 255.0 for x in range(256)]
gamma_table = np.round(np.array(gamma_table)).astype(np.uint8)
return cv2.LUT(img, gamma_table)
def random_gamma_transform(img, gamma_vari):
log_gamma_vari = np.log(gamma_vari)
alpha = np.random.uniform(-log_gamma_vari, log_gamma_vari)
gamma = np.exp(alpha)
return gamma_transform(img, gamma)
- 原图做增加噪声操作(高斯噪声,椒盐噪声)
def add_noise(img):
for i in range(200): #添加点噪声
temp_x = np.random.randint(0,img.shape[0])
temp_y = np.random.randint(0,img.shape[1])
img[temp_x][temp_y] = 255 #255白色
return img
最终的结果: