有时候,为了方便管理我们的图像数据集或其他类型的数据集,或者使用图像建立一个仿真环境。我们可能需要使用到tif格式来保存图像。
在这里我简单介绍一下自己的思路和详细细节。
老规矩,先上代码。
#-----------------------------------------------------
#将文件夹中的图像保存到tif中
import os
from skimage import io
#filepath='D:\\3DUSRebuild\\MyYOLO5\\yolov5\\data\\tif_8'
filepath='D:\\3DUSRebuild\\MyYOLO5\\yolov5\\test_model\\yuanshituxiangxulie'
files=os.listdir(filepath)
print(io.imread(os.path.join(filepath,files[0])).shape[0])
print(io.imread(os.path.join(filepath,files[0])).shape[2])
count=0
'''
im3d=np.zeros(shape=(len(files),io.imread(os.path.join(filepath,files[0])).shape[0],
io.imread(os.path.join(filepath,files[0])).shape[1]),dtype='uint8')
关对im3d=np.zeros(....)这个函数的分析,即使用思路
首先,shape=(),第一个维度len(files)使我们这次要保存到im3d模型中的新的维度的数据的维度,例如我们想将30张图像保存到tif中,len(files)表示图像的数量,也就是这个文件夹下文件的数量。
还是以将30张图像保存到fit中为例,第二个变量io.imread(os.path.join(filepath,files[0])).shape[0]和io.imread(os.path.join(filepath,files[0])).shape[1]是图像的长宽
当我们将已经保存好的tif继续保存到更高维度的tif中时,此时参数会发生变化,例如我们将20个只有30张图像的fit保存到一个新的tif容器中。
看一下此时的代码格式
im3d=np.zeros(shape=(len(files),io.imread(os.path.join(filepath,files[0])).shape[0],
io.imread(os.path.join(filepath,files[0])).shape[1],
io.imread(os.path.join(filepath,files[0])).shape[2],),dtype='uint8')
此时,len(files)表示文件夹下tif的数量,len(files)=20,
io.imread(os.path.join(filepath,files[0])).shape[0]表示包含30张图像的tif中图像的数量,
io.imread(os.path.join(filepath,files[0])).shape[1]表示图像的长
io.imread(os.path.join(filepath,files[0])).shape[2]表示图像的宽
以此类推,知道你将你所有的图像都保存进来。这个tif的维度可以很高很高。
其实,理解这个保存图像的思想很简单,我们只需要理解向零矩阵中填充数据的规则就可以了
我们就是使用零矩阵初始化一个容器。这个容器首先需要初始尺寸其尺寸。第0维为新一批数据的数量,后面是已经保存好的tif或者是图像的尺寸
在填充时,其实我们只需要在len(files)这个维度填充数据就可以了
'''
'''
im3d=np.zeros(shape=(len(files),io.imread(os.path.join(filepath,files[0])).shape[0],
io.imread(os.path.join(filepath,files[0])).shape[1],
io.imread(os.path.join(filepath,files[0])).shape[2],
io.imread(os.path.join(filepath,files[0])).shape[3],
io.imread(os.path.join(filepath,files[0])).shape[4],
io.imread(os.path.join(filepath,files[0])).shape[5]),
dtype='uint8')
im3d=np.zeros(shape=(len(files),io.imread(os.path.join(filepath,files[0])).shape[0],
io.imread(os.path.join(filepath,files[0])).shape[1]),dtype='uint8')
print(im3d.shape) #,io.imread(os.path.join(filepath,files[0])).shape[2])
for file_ in files:
im2d=io.imread(os.path.join(filepath,file_))
im3d[count]=im2d
count+=1
print(im3d.shape)
kk = im3d.shape
print(kk[1])
io.imsave('D:\\3DUSRebuild\\MyYOLO5\\yolov5\\data\\ThreeModelUS\\final_model.tif',im3d)
由于需要读取和保存图像,因此我们需要import两个模块。
关于代码的具体介绍和思路在代码中了,仔细看吧
其实思想很简单,就实现生成一个固定了维度的矩阵容器。然后整各维度的替换矩阵容器的数据,具体参考下面的代码就明白了上面的思路了
#随机生成一个数组,维度为(2,3,3),即这个高维矩阵中有两个3*3的矩阵
#我们替换2这个维度中的数据
arr1 = np.random.randint(2,4,(2,3,3))
print(arr1)
print('0')
print(arr1[0])
print('1')
print(arr1[1])
brr = np.array([[1,1,1],[1,1,1],[1,1,1]
])
print(brr)
arr1[1] = brr
print('11')
print(arr1[1])
print('00')
print(arr1[0])