由上面几张图可以看出,主办方把训练图像和测试图像搞成了4通道,数据类型为uint16类型,计算机可视化图像一般是三通道,数据类型为uint8,或者单通道,数据类型为uint8。
训练图像的标签也是黑乎乎的原因,标签图像是单通道uint8没有错,只是由于标签数量为五类,分别分为五类:植被(标记1)、建筑(标记2)、水体(标记3)、道路(标记4)以及其他(标记0),耕地、林地、草地均归为植被类。只是数值太小了,数值0到4的灰度图肯定是黑乎乎的,可以相应同步把数据增加128就可以看到了,或者给标签着色(一个标签数值对应一个三通道颜色)
可视化训练图像和测试图像代码如下,通过下面代码就可以可视化图像了:
img = cv2.imread("D:\BaiduNetdiskDownload\BDCI2017-jiage-Semi\\testing\\testing1.png", cv2.IMREAD_UNCHANGED)
img_out = np.zeros((img.shape[0],img.shape[1],3)).astype(np.uint8)
img_out = img[:,:,:3]
img_out = img_out.astype(np.uint8)
cv2.imwrite("D:\BaiduNetdiskDownload\BDCI2017-jiage-Semi\\testing\\testing11.png", img_out)
标签着色代码:
#注意:opencv读取图片的三通道顺序是bgr
others = [0, 0, 255] #红色 其他
plant = [0, 255, 0] #绿色 植被
building = [255, 0, 0] #蓝色 建筑
water = [0, 255, 255] #黄色 水体
road = [255, 255, 255] #白色 道路
color_dit = np.array([others,plant,building,water,road])
#给图像分割标签打上颜色
def label_color(predit_map,color_dict,num_class):
# 如果图像是三通道,则取第一通道
img = predit_map[:, :, 0] if len(predit_map.shape) == 3 else predit_map
# 预先分配三通道的空间
img_out = np.zeros(img.shape +(3,))
for i in range(num_class):
debug = (img == i)
# 如果img像素值等于i,则把img_out对应位置的三通道值设置为color_dit[i]
img_out[img == i,:] = color_dit[i]
return img_out