近期在做深度学习模型训练的时候,打算把图像以64*64的图像块喂入神经网络中,故学习如何将图像进行拆分、对拆分后的图像合并还原,以下是基于matlab实现。网上有现成关于单张图像拆分的实现,由于需要对某个文件夹下的所有图像进行拆分,故在已有的代码基础上进行了整理实现对某个文件夹下的所有图像进行拆分。
批量拆分:
% 以下为对某个文件夹下的所有图像进行拆分,并且每一张图像保存为一个文件夹(名字和图像名字相同),主要是以便于后续对图像进行合并复原。
clc;
clear all;
file_path = 'I:\SC2020-0063-0001\transform\image\mask\';
dest_path = 'I:\SC2020-0063-0001\transform\image\mask_patch\';
files = dir(strcat(file_path,'\','*.tif'));
img_num = length(files) % 获取图像总数量
height=64;
width=64;
for i=1:img_num
% 获取第i副图像名字
FileName = string(files(i).name)
% 读取图像
I=imread(strcat(file_path, FileName));
% 获取图像的前缀名
r = FileName.split('.')
img_name = r(1,1)
% mkdir(dest_path,img_name);
%I = rgb2gray(I) % rgb转换为灰度图
[m,n]=size(I);%求出图像矩阵的大小
%% 以下为判断图像尺寸能否被64整除的情况,考虑到整除时除不尽向下取整可能会破坏图像边缘信息,
% 如果向下取整floor不会破坏边缘信息,这一部分代码可以省略(我这里是补到图像边缘的左边和下面)
%判断原来图像尺寸能否被64整除,如果不能,则把图像补成行数和列数均为8的倍数的矩阵
% 如果行列均不能被64整除,则行列都补
if mod(m,64)~=0 && mod(n,64)~=0
m1=64-mod(m,64);
n1=64-mod(n,64);
I_m=zeros(m1,n);
I=[I;I_m];%将行数补成64的整数倍
I_n=zeros(m+m1,n1);
I=[I_n I];%将列数补成64的整数倍
end
% 如果行能被64整除,列不能,则补列
if mod(m,64)==0 && mod(n,64)~=0
n1=64-mod(n,64);
I_n=zeros(m,n1);
I=[I_n I];%将列数补成64的整数倍
end
% 如果列能被64整除,行不能,则补行
if mod(m,64)~=0 && mod(n,64)==0
m1=64-mod(m,64);
I_m=zeros(m1,n);
I=[I; I_m];%将行数补成64的整数倍
end
%%
L = size(I);
% floor向下取整 ceil向上取整
max_row = floor(L(1)/height);
max_col = floor(L(2)/width);
for row = 1:max_row
for col = 1:max_col
seg(row,col)= {I((row-1)*height+1:row*height,(col-1)*width+1:col*width,:)};
end
end
for i=1:max_row*max_col
imwrite(seg{i},strcat(dest_path,img_name,'-',int2str(i),'.tif'));
end
end
批量合并:
% 以下为对上面进行拆分后的图像进行合并复原并保存在同一路径中。
clc;
clear all;
file_path = "I:\SC2020-0063-0001\transform\image\hebing\";
dst_path = "I:\SC2020-0063-0001\transform\image\result\";
files = dir(file_path);
% 文件夹的数目即为最后合并完图像的总数
img_num = length(files)-2
% 这里m,n对应上述代码中的max_row,max_col
m = 7;
n = 9;
for i=1:img_num
FileName = string(files(i+2).name)
BigPic = cell(m, n);
for i = 1 : m * n
BigPic{i} = imread(strcat(file_path,FileName,'\',FileName,'-', num2str(i),'.tif'));
end
BigPic = cell2mat(BigPic);
imwrite(BigPic,strcat(dst_path,FileName,'.tif'));
end
以下是批量合并的Python实现
import PIL.Image as Image
import glob
import os
def image_compose(image_path, image_row, image_col, image_name, image_save_path, image_size=64):
"""
:param image_row: 合并成一张图后,一共有几行
:param image_col: 合并成一张图后,一共有几列
:param image_name: 保存的图像名字
:param image_size: 每张小图片的大小
"""
if len(image_path) != image_row * image_col:
raise ValueError("合成图片的参数和要求的数量不能匹配!")
to_image = Image.new('L', (image_col * image_size, image_row * image_size))
for y in range(1, image_col + 1):
for x in range(1, image_row + 1):
from_image = Image.open(image_path[image_row * (y - 1) + x - 1])
to_image.paste(from_image, ((y - 1) * image_size, (x - 1) * image_size))
to_image.save(os.path.join(image_save_path, (image_name+".tif")))
def batch_concat():
file_path = "H:\\SC2020-0063-0001\\transform\\image\\hebing\\"
file_list = os.listdir(file_path)
for i in range(len(file_list)):
image_path = glob.glob(file_path + file_list[i] + "\\*.tif")
image_compose(image_path, 7, 9, file_list[i], "H:\\SC2020-0063-0001\\transform\\image\\result\\")
batch_concat()
python实现后图像占用的空间比原来大,我觉得主要可能是因为用PIL库造成的,暂时没找到用python合并还原后不会引起占用空间变大的方式。