将256*256图像分成4*4块
136条意见(过去30天)
显示旧注释
回答(5)
图像分析
2013年4月15日
下面是我的标准“将图像分割成块”演示。它可以通过两种方式(你可以选择你最喜欢的方式)和两种类型的图像(灰度和颜色)来实现这一点。它非常通用,所以如果你有特定的条件,它可以缩短一些,比如你知道图像中有整数数量的块(即,边缘没有部分块)。
演示将图像分成块(不重叠的瓷砖)。
第一种将图像分割成块的方法是使用mat2cell()。
在这个演示中,我用一张彩色图像演示了这一点。。
另一种将图像分割成块的方法是使用索引。。
在这个演示中,我用灰度图像演示了该方法。。
clc;清除命令窗口。
关闭所有;关闭所有图形(imtool的图形除外)。
工作空间;%确保工作区面板正在显示。
fontSize = 20;
读取一个标准的MATLAB彩色演示图像。
文件夹= fullfile(matlabroot,“\工具箱\ \ imdemos图像”);
baseFileName =“peppers.png”;
获取完整的文件名,并预先添加路径。
fullFileName = fullfile(文件夹,baseFileName);
如果~存在(fullFileName“文件”)
我没有在那儿找到它。检查它的搜索路径。
fullFileName = baseFileName;这次没有路径。
如果~存在(fullFileName“文件”)
还是没有找到。提醒用户。
errorMessage = sprintf(“错误:%s不存在。”, fullFileName);
uiwait (warndlg (errorMessage));
返回;
结束
结束
从磁盘读取映像。
rgbImage = imread(fullFileName);
如果您想用灰度图像来测试代码。。
如果您想查看它如何处理灰度图像,取消下面的注释行。。
% rgbImage = rgb2gray(rgbImage);
%显示全屏图像。
imshow (rgbImage);
将数字放大到全屏。
集(gcf,“单位”,“归一化”,“outerposition”,[0 0 1 1]);
drawnow;
获取图像的尺寸。numberOfColorBands应该= 3。
[rows columns numberOfColorBands] = size(rgbImage)
%==========================================================================
第一种将图像分割成块的方法是使用mat2cell()。
blockSizeR = 150;块中的行数。
blockSizeC = 100;%在块中的列。
按行计算出每个块的大小。
%大多数将是blockSizeR,但可能会有剩余的数量少于这个。
wholeBlockRows = floor(rows / blockSizeR);
blockvector = [blockSizeR * ones(1, wholeBlockRows), rem(rows, blockSizeR)];
计算出每个块在列中的大小。
wholeBlockCols = floor(columns / blockSizeC);
blockVectorC = [blockSizeC * ones(1, wholeBlockCols), rem(columns, blockSizeC)];
创建单元格数组ca。
%每个单元格(图像末尾的其余单元格除外)
数组中的%包含一个blockSizeR by blockSizeC by 3颜色数组。
这一行是图像实际上被分成块的地方。。
如果numberOfColorBands >
这是一张彩色图片。
ca = mat2cell(rgbImage, blockvector, blockVectorC, numberOfColorBands);
其他的
ca = mat2cell(rgbImage, blockVectorR, blockVectorC);
结束
%现在显示所有的块。
plotIndex = 1;
numPlotsR = size(ca, 1);
numPlotsC = size(ca, 2);
为r = 1: numPlotsR
为c = 1: numPlotsC
流('plotindex =%d, c=%d, r=%d\n', c, r);
指定图像的显示位置。
subplot(numPlotsR, numPlotsC, plotIndex);
从单元格中提取数值数组
只是作为教程的目的。
rgblock = ca{r,c};
imshow (rgbBlock);可以调用imshow(ca{r,c}),如果你想。
[rowsB columnsB numberOfColorBandsB] = size(rgblock);
使标题为区块编号。
说明= sprintf('块#%d的%d\n%d行由%d列组成',...
, numPlotsR*numPlotsC, rowsB, columnsB);
标题(标题);
drawnow;
将子图增加到下一个位置。
plotIndex = plotIndex + 1;
结束
结束
在左上角显示原始图像。
Subplot (4,6,1);
imshow (rgbImage);
标题(原始图像的);
%==============================================================================
另一种将图像分割成块的方法是使用索引。。
读取在一个标准的MATLAB灰度演示图像。
文件夹= fullfile(matlabroot,“\工具箱\ \ imdemos图像”);
baseFileName =“cameraman.tif”;
fullFileName = fullfile(文件夹,baseFileName);
获取完整的文件名,并预先添加路径。
fullFileName = fullfile(文件夹,baseFileName);
如果~存在(fullFileName“文件”)
我没有在那儿找到它。检查它的搜索路径。
fullFileName = baseFileName;这次没有路径。
如果~存在(fullFileName“文件”)
还是没有找到。提醒用户。
errorMessage = sprintf(“错误:%s不存在。”, fullFileName);
uiwait (warndlg (errorMessage));
返回;
结束
结束
grayImage = imread(fullFileName);
获取图像的尺寸。numberOfColorBands应该= 1。
[rows columns numberOfColorBands] = size(grayImage);
%显示原始灰度图像。
图;
Subplot (2,2,1);
imshow (grayImage []);
标题(“原始灰度图像”,“字形大小”、字形大小);
将数字放大到全屏。
集(gcf,“单位”,“归一化”,“outerposition”,[0 0 1 1]);
将图像分成4个块。
让我们假设我们知道块的大小,并且所有的块都是相同的大小。。
blockSizeR = 128;块中的行数。
blockSizeC = 128;%在块中的列。
计算出每个块的大小。
wholeBlockRows = floor(rows / blockSizeR);
wholeBlockCols = floor(columns / blockSizeC);
预分配一个3D图像
image3d = 0 (wholeBlockRows, wholeBlockCols, 3);
现在扫描,获取每个块,并将其作为一个3D数组的切片。。
sliceNumber = 1;
为row = 1: blockSizeR:行
为col = 1: blockSizeC: columns
让我们在变量中明确一点。
%以便更容易地看到发生了什么。
Row1 = row;
row2 = row1 + blockSizeR - 1;
Col1 = col;
col2 = col1 + blockSizeC - 1;
提取出块到一个单一的子图像。
oneBlock = grayImage(row1:row2, col1:col2);
指定图像的显示位置。
subplot(2,2, sliceNumber);
imshow (oneBlock);
使标题为区块编号。
说明= sprintf(“Block #%d of 4”, sliceNumber);
标题(标题,“字形大小”、字形大小);
drawnow;
将这个切片分配给我们刚刚提取的图像。
image3D(:,:, sliceNumber) = oneBlock;
sliceNumber = sliceNumber + 1;
结束
结束
image3D是一个3D图像,其中每个切片,
%或平面,是原始二维图像的一个象限。
对话框(“演示完成!”看看这两个数字。”);
14日的评论
沃尔特·罗伯森
2021年9月8日
horizontal_top = YourImage(1:floor(end/2),:);
horizontal_bottom = YourImage(floor(end/2)+1:end,:);
分割左右的代码是类似的。
沿着对角线、圆或n形分割的代码比较困难。
Ashwin
2016年9月20日
编辑:沃尔特·罗伯森
2016年9月20日
很简单,使用这个函数
函数dividedImage = divideIntoBlocks(InputImage,BlockSize)
img1 = InputImage;
TOTAL_BLOCKS = size(img1,1)*size(img1,2) / (BlockSize*BlockSize);
dividedImage = zero ([BlockSize BlockSize TOTAL_BLOCKS]);
行= 1;
Col = 1;
试一试
为数= 1:TOTAL_BLOCKS
dividedImage(:,:,count) = img1(row:row+BlockSize-1,col:col+BlockSize-1);
col = col + BlockSize;
如果(col >= size(img1,2))
Col = 1;
row = row + BlockSize;
如果(row >= size(img1,1))
行= 1;
结束
结束
结束
结束
托马斯。
2012年3月22日
试试这个例子:
一个=兰德(16日16);%矩阵的16*16
[a b] = size(a);%得到A的大小=16*16
c = 4; d = 4;将其重塑为4*4矩阵
l = 0;
为我= 1:c: a - 3
为j = 1: d:酮
C =((我+ 3)(j: + 3));
eval ([“out_”num2str(左)' = C '])
l = l + 1;
结束
结束
你应该得到16个4*4矩阵,名称从out_0到out_15