在图像分块之前需要找到你想要分块的图像的路径,若用matlab自带的图片可在此路径查看:C:\Program Files\MATLAB\R2014a\toolbox\images\imdata 若没找到该路径,就回忆一下自己把matlab安装在哪个目录下,然后去找到:MATLAB\R2014a\toolbox\images\imdata 这个路径就可查看matlab自带的图片
一般对图像处理的研究中会因为图片尺寸太大不好处理的情况,这种时候就需要将图像进行分块,正好我用到了两种形式的分块方式,在此记录下来以供参考。
程序语言中对图像的分块是严谨的,虽然我们看到的最终分块的结果和我们预想的差不多,但在计算机处理中处理的过程却麻烦许多。
1. z字形图像分块:
大概的分块思路用一张图就可以明确:按照从左到右,从上到下分块的方式将图片分块,这也是比较常见的一种分块方式,计算机要一个块一个块的分出来,分完才能达到这样的效果,如下所示。
z字形分块的matlab代码如下:
% 读取图片 %imread('图片的路径\图片名称.图片格式')
image = imread('D:\Matlab\matlab\Polyspace\R2020b\toolbox\images\imdata\cameraman.tif');
% 获取图片的尺寸
[height, width] = size(image);
% 分块的大小
blockSizeR = 16; % 分块大小要能整除图片大小
blockSizeC = 16;
number_height = height/blockSizeR; % 高度可以分成几块
number_width = width/blockSizeC;
number_block = number_height * number_width; % 分块的个数
% 对图像z字形分块
blocks = zeros(blockSizeR,blockSizeC,number_block);
count = 0; % 存索引
for i = 1 : blockSizeR : height
for j = 1 : blockSizeC : width
count = count + 1;
blocks(:, :, count) = image(i:i+blockSizeR-1, j:j+blockSizeC-1);
end
end
显示图像代码如下:
% 显示图片
imshow(image)
% 显示分块的结果
figure
count = 0;
for i = 1:number_height
for j = 1:number_width
count = count+1;
block = blocks(:, :, count);
subplot(number_height,number_width,count);
imshow(block,[]);
end
end
分块的结果如下:
2. 使用matlab自带的分块函数 : mat2cell() 代码如下:
% matlab自带的分块函数
% 初始化
clear; clc; close all;
% 读取图片 %imread('图片的路径\图片名称.图片格式')
image = imread('D:\Matlab\matlab\Polyspace\R2020b\toolbox\images\imdata\cameraman.tif');
% 获取图片的尺寸
[height, width] = size(image);
% 分块的大小
blockSizeR = 16; % 分块大小要能整除图片大小
blockSizeC = 16;
number_height = height/blockSizeR; % 高度可以分成几块
number_width = width/blockSizeC;
% 分块
blocks = mat2cell(image, blockSizeR * ones(1, number_height), blockSizeC * ones(1, number_width));
需要注意的是mat2cell将图片image制作成了元胞数组,此时若想用子块的数据需要用大括号blocks{第几行,第几列}才能给子块的数据调出来,具体代码如下:
% 调用第2行第3列的子块的具体数据
block = blocks{2,3};
显示图像的代码:
% 显示图片
imshow(image)
% 显示分块的结果
figure
count = 0;
for i = 1:number_height
for j = 1:number_width
count = count+1;
block = blocks{i,j};
subplot(number_height,number_width,count);
imshow(block,[]);
end
end
显示的结果:结果和第一种方法是一样的。
总结:记录了两种matlab对图像分块的方式和代码,一般我会用第二个,简单方便。