matlab实现将图像拆分成64*64的图像块

近期在做深度学习模型训练的时候,打算把图像以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合并还原后不会引起占用空间变大的方式。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值