背景
最近做一个基于DeeplabV3+解包裹的任务,在处理训练数据集时,需要将mat文件中的矩阵转换为对应的Png图片。矩阵中每个值对应一个标签值,如果直接转换为png图片,那么每个矩阵的最大值和最小值分别会被转换为255和0的灰度值,中间的值则会线性的转化为灰度值。这样会导致每张转换后的图片出现灰度值不一致的情况,从而失去标签的效果,那么怎么样使其转化之后不同的图片间同一个数字对应的灰度值一致呢?为了解决这个问题,想了一下午,终于解决,在此记录一下。
方法
# author:zzm
# datetime:2021/12/17 15:30
import scipy.io as sio
import scipy.misc
import imageio
#5000张图片循环
for i in range(1,5001):
#Mat文件以字典形式读取
mat_data = sio.loadmat('C:/Users/zzm/Desktop/data/k/k_'+str(i)+'.mat')
#读取数组矩阵,256x256
array1 = mat_data['www'].astype(int)
#将左上角第一个值设置为20
array1[0][0]=20
#将矩阵转换为png图片
imageio.imsave("C:/Users/zzm/Desktop/png/wrap("+str(i)+').png', array1)
由背景可以分析得到,之所以转换之后不同图片间相同的值对应的灰度值不同,主要是因为最大值不一致,所以我统一的将每个矩阵的左上角设置为20,比每个矩阵的最大值都大,这样在转换时就会有同样的线性转换。
结论
可以看到最终转换的图灰度值具有一致性。有一个小缺陷就是左上角会有一个像素的白点。这是个小问题,我把这个小白点也当成一个标签来处理,训练之后的网络用来预测时产生的语义分割图片左上角应该也会带有一个白点,所以这个白点可以放在网络之外的步骤来处理。