Divide 256*256 image into 4*4 blocks

81 views (last 30 days)
kush
kush on 22 Mar 2012
Commented: Walter Roberson on 8 Sep 2021
I am working on a project of image processing (watermarking) & needs to divide 256*256 image into 4*4 blocks (overlaping) to get 4096 matrices.If anyone knows about it plz help me.
  5 Comments
Walter Roberson
Walter Roberson on 26 Oct 2016
Interesting, I had not encountered (or had forgotten) im2col(). I see it outputs a single numeric matrix, though, not a cell array.

Sign in to comment.

Answers (5)

Image Analyst
Image Analyst on 15 Apr 2013
Here's my standard "split an image up into blocks" demo. It does this two ways (you can pick your favorite way), and for two types of images (gray scale and color). It's very general so it could be shortened some if you have certain conditions, like you know that there is an integer number of blocks in the image (i.e., no partial blocks at the edges).
% Demo to divide an image up into blocks (non-overlapping tiles).
% The first way to divide an image up into blocks is by using mat2cell().
% In this demo, I demonstrate that with a color image.
% Another way to split the image up into blocks is to use indexing.
% In this demo, I demonstrate that method with a grayscale image.
clc; % Clear the command window.
close all; % Close all figures (except those of imtool.)
workspace; % Make sure the workspace panel is showing.
fontSize = 20;
% Read in a standard MATLAB color demo image.
folder = fullfile(matlabroot, '\toolbox\images\imdemos');
baseFileName = 'peppers.png';
% Get the full filename, with path prepended.
fullFileName = fullfile(folder, baseFileName);
if ~exist(fullFileName, 'file')
% Didn't find it there. Check the search path for it.
fullFileName = baseFileName; % No path this time.
if ~exist(fullFileName, 'file')
% Still didn't find it. Alert user.
errorMessage = sprintf('Error: %s does not exist.', fullFileName);
uiwait(warndlg(errorMessage));
return;
end
end
% Read the image from disk.
rgbImage = imread(fullFileName);
% Test code if you want to try it with a gray scale image.
% Uncomment line below if you want to see how it works with a gray scale image.
% rgbImage = rgb2gray(rgbImage);
% Display image full screen.
imshow(rgbImage);
% Enlarge figure to full screen.
set(gcf, 'units','normalized','outerposition',[0 0 1 1]);
drawnow;
% Get the dimensions of the image. numberOfColorBands should be = 3.
[rows columns numberOfColorBands] = size(rgbImage)
%==========================================================================
% The first way to divide an image up into blocks is by using mat2cell().
blockSizeR = 150; % Rows in block.
blockSizeC = 100; % Columns in block.
% Figure out the size of each block in rows.
% Most will be blockSizeR but there may be a remainder amount of less than that.
wholeBlockRows = floor(rows / blockSizeR);
blockVectorR = [blockSizeR * ones(1, wholeBlockRows), rem(rows, blockSizeR)];
% Figure out the size of each block in columns.
wholeBlockCols = floor(columns / blockSizeC);
blockVectorC = [blockSizeC * ones(1, wholeBlockCols), rem(columns, blockSizeC)];
% Create the cell array, ca.
% Each cell (except for the remainder cells at the end of the image)
% in the array contains a blockSizeR by blockSizeC by 3 color array.
% This line is where the image is actually divided up into blocks.
if numberOfColorBands > 1
% It's a color image.
ca = mat2cell(rgbImage, blockVectorR, blockVectorC, numberOfColorBands);
else
ca = mat2cell(rgbImage, blockVectorR, blockVectorC);
end
% Now display all the blocks.
plotIndex = 1;
numPlotsR = size(ca, 1);
numPlotsC = size(ca, 2);
for r = 1 : numPlotsR
for c = 1 : numPlotsC
fprintf('plotindex = %d, c=%d, r=%d\n', plotIndex, c, r);
% Specify the location for display of the image.
subplot(numPlotsR, numPlotsC, plotIndex);
% Extract the numerical array out of the cell
% just for tutorial purposes.
rgbBlock = ca{r,c};
imshow(rgbBlock); % Could call imshow(ca{r,c}) if you wanted to.
[rowsB columnsB numberOfColorBandsB] = size(rgbBlock);
% Make the caption the block number.
caption = sprintf('Block #%d of %d\n%d rows by %d columns', ...
plotIndex, numPlotsR*numPlotsC, rowsB, columnsB);
title(caption);
drawnow;
% Increment the subplot to the next location.
plotIndex = plotIndex + 1;
end
end
% Display the original image in the upper left.
subplot(4, 6, 1);
imshow(rgbImage);
title('Original Image');
%==============================================================================
% Another way to split the image up into blocks is to use indexing.
% Read in a standard MATLAB gray scale demo image.
folder = fullfile(matlabroot, '\toolbox\images\imdemos');
baseFileName = 'cameraman.tif';
fullFileName = fullfile(folder, baseFileName);
% Get the full filename, with path prepended.
fullFileName = fullfile(folder, baseFileName);
if ~exist(fullFileName, 'file')
% Didn't find it there. Check the search path for it.
fullFileName = baseFileName; % No path this time.
if ~exist(fullFileName, 'file')
% Still didn't find it. Alert user.
errorMessage = sprintf('Error: %s does not exist.', fullFileName);
uiwait(warndlg(errorMessage));
return;
end
end
grayImage = imread(fullFileName);
% Get the dimensions of the image. numberOfColorBands should be = 1.
[rows columns numberOfColorBands] = size(grayImage);
% Display the original gray scale image.
figure;
subplot(2, 2, 1);
imshow(grayImage, []);
title('Original Grayscale Image', 'FontSize', fontSize);
% Enlarge figure to full screen.
set(gcf, 'units','normalized','outerposition',[0 0 1 1]);
% Divide the image up into 4 blocks.
% Let's assume we know the block size and that all blocks will be the same size.
blockSizeR = 128; % Rows in block.
blockSizeC = 128; % Columns in block.
% Figure out the size of each block.
wholeBlockRows = floor(rows / blockSizeR);
wholeBlockCols = floor(columns / blockSizeC);
% Preallocate a 3D image
image3d = zeros(wholeBlockRows, wholeBlockCols, 3);
% Now scan though, getting each block and putting it as a slice of a 3D array.
sliceNumber = 1;
for row = 1 : blockSizeR : rows
for col = 1 : blockSizeC : columns
% Let's be a little explicit here in our variables
% to make it easier to see what's going on.
row1 = row;
row2 = row1 + blockSizeR - 1;
col1 = col;
col2 = col1 + blockSizeC - 1;
% Extract out the block into a single subimage.
oneBlock = grayImage(row1:row2, col1:col2);
% Specify the location for display of the image.
subplot(2, 2, sliceNumber);
imshow(oneBlock);
% Make the caption the block number.
caption = sprintf('Block #%d of 4', sliceNumber);
title(caption, 'FontSize', fontSize);
drawnow;
% Assign this slice to the image we just extracted.
image3D(:, :, sliceNumber) = oneBlock;
sliceNumber = sliceNumber + 1;
end
end
% Now image3D is a 3D image where each slice,
% or plane, is one quadrant of the original 2D image.
msgbox('Done with demo! Check out the two figures.');
  14 Comments
Image Analyst
Image Analyst on 8 Sep 2021
@Anas Alkahlout, you can do this
[rows, columns, numColors] = size(yourImage);
midRow = round(rows/2);
midCol = round(columns/2);
leftHalf = yourImage(:, 1:midCol, :);
rightHalf = yourImage(:, midCol + 1 : end, :);
topHalf = yourImage(1:midRow, :, :);
bottomHalf = yourImage(midRow + 1 : end, :, :);
Walter Roberson
Walter Roberson on 8 Sep 2021
horizontal_top = YourImage(1:floor(end/2), :);
horizontal_bottom = YourImage(floor(end/2)+1:end,:);
The code for splitting left and right is similar.
The code for splitting along diagonals or circles or n-gons is more difficult.

Sign in to comment.


Ashwin
Ashwin on 20 Sep 2016
Edited: Walter Roberson on 20 Sep 2016
Simple, use this function
function dividedImage = divideIntoBlocks(InputImage,BlockSize)
img1 = InputImage;
TOTAL_BLOCKS = size(img1,1)*size(img1,2) / (BlockSize*BlockSize);
dividedImage = zeros([BlockSize BlockSize TOTAL_BLOCKS]);
row = 1;
col = 1;
try
for count=1:TOTAL_BLOCKS
dividedImage(:,:,count) = img1(row:row+BlockSize-1,col:col+BlockSize-1);
col = col + BlockSize;
if(col >= size(img1,2))
col = 1;
row = row + BlockSize;
if(row >= size(img1,1))
row = 1;
end
end
end
end
  2 Comments
Subhajit Chatterjee
Subhajit Chatterjee on 5 Feb 2017
How to overlay each divided image(tile) into the original image with its corresponding index text on each tile?
sujata sankhwar
sujata sankhwar on 23 Feb 2017
how to use this function for 50% overlapping blocks. plz ans

Sign in to comment.


Thomas
Thomas on 22 Mar 2012
Try this example:
A=rand(16,16); %matrix of 16*16
[a b] = size(A); % get the size of A =16*16
c=4;d=4; % reshape it into 4*4 matrices
l=0;
for i=1:c:a-3
for j=1:d:b-3
C=A((i:i+3),(j:j+3));
eval(['out_' num2str(l) '=C'])
l=l+1;
end
end
You should get 16 4*4 matrices with names out_0 to out_15
  11 Comments
gaetan gildas
gaetan gildas on 3 Feb 2021
thanks you once more. Now i will like to obtain the image 256*256 after working with 16*16 blocks?
Image Analyst
Image Analyst on 3 Feb 2021
Not sure what that ("obtain") means, but are you aware of imresize()?

Sign in to comment.


aya elfatyany
aya elfatyany on 11 Feb 2015
i am working on project on security its major is secret sharing and after i made a permutation sequence to permute the pixels of the secret image . i want to take pixels of permuted image to form a section so how can i form a section?
  1 Comment
Image Analyst
Image Analyst on 11 Feb 2015
I have no idea what that means. What is a section? For what it's worth, I've attached a very simplistic image scrambling script.

Sign in to comment.


W.Khan
W.Khan on 14 Oct 2017
Edited: Image Analyst on 14 Oct 2017
Hello, I divide my image into multiple blocks, but I want to save these new blocks to a folder. But I can't save it to another folder.
for i=1:10
a=rgbBlock;
imwrite (a,sprintf('%d.jpg',i));
end
All the new blocks are the same. I mean that the new blocks replace the old blocks of the image. Can you help how to do it? Also, how to do it for multiple images. Kindly comments
  14 Comments
Pandu Ananto
Pandu Ananto on 8 May 2019
i still dont understand how to change the total of the blocks...
if i want to get 4x4 blocks, i have to change
blockSizeR = 64;
blockSizeC = 64;
right? so that i get 4x4 each of them have 64 pixel row and col
i get this error
Subscripted assignment dimension
mismatch.
Error in coba_split (line 77)
image3D(:, :, sliceNumber)
= oneBlock;
why? pls help...
Image Analyst
Image Analyst on 9 May 2019
In blockproc() the parameters are the block sizes (horizontal and vertical). You can get the number of blocks by dividing the rows and columns by the block size. It's a simple relationship
rowsInImage = blockSizeR * numberOfBlocksVertically;
Do whatever math on that equation to get the parameter you need.

Sign in to comment.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!