将256*256图像分成4*4块

136条意见(过去30天)
库什
库什 2012年3月22日
我正在做一个图像处理(水印)的项目,需要将256*256的图像分成4*4块(重叠),以得到4096个矩阵。如果有人知道这件事,请帮助我。
5个评论
沃尔特·罗伯森
沃尔特·罗伯森 2016年10月26日
有趣的是,我没有遇到过(或忘记了)im2col()。我看到它输出一个数字矩阵,但不是单元格数组。

登录发表评论。

回答(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
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;
结束
结束
结束
结束
2的评论
苏sankhwar
苏sankhwar 2017年2月23日
如何对50%重叠的块使用这个函数。请答

登录发表评论。


托马斯。
托马斯。 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
11日评论
图像分析
图像分析 2021年2月3日
不确定那(“获取”)是什么意思,但您知道imresize()吗?

登录发表评论。


阿雅elfatyany
阿雅elfatyany 2015年2月11日
我正在做一个安全项目,它的专业是秘密共享,我做了一个排列序列来排列秘密图像的像素。我想用排列后的图像的像素组成一个剖面那么我怎么形成一个剖面呢?
1评论
图像分析
图像分析 2015年2月11日
我不知道那是什么意思。什么是节?无论如何,我附上了一个非常简单的图像打乱脚本。

登录发表评论。


W.Khan
W.Khan 2017年10月14日
编辑:图像分析 2017年10月14日
你好,我把我的图像分成多个块,但我想把这些新块保存到一个文件夹。但我不能把它保存到另一个文件夹。
i = 1:10
一个= rgbBlock;
imwrite (sprintf (“% d.jpg”,我));
结束
所有的新积木都是一样的。我的意思是新的块替换了图像的旧块。你能帮我怎么做吗?此外,如何为多个图像做它。请评论
14日的评论
图像分析
图像分析 2019年5月9日
在blockproc()中,参数是块大小(水平和垂直)。你可以通过用行和列除以块大小来得到块的数量。这是一种简单的关系
rowsInImage = blockSizeR * numberofblocksvertical;
对这个方程做任何数学运算来得到你需要的参数。

登录发表评论。

社区寻宝

在MATLAB中央找到宝藏,并发现社区可以如何帮助你!

开始狩猎!