Hi all, i want to divide the image into 4×4= 16 sub images. how i can do this and then further each sub image can be dividable into 2×2 square blocks. each sub images and each block should be accessible separately.
MATLAB: Divide the image into 4×4 sub images
4x4 division
Related Solutions
Yes, the very frequently asked "How do I split an image into blocks?" question. See my demo:
% Demo to divide a color image up into blocks.
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';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; endend% 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; endend% 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; endendgrayImage = 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 : blockSizeR : 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); drawnow; % Assign this slice to the image we just extracted.
image3D(:, :, sliceNumber) = oneBlock; sliceNumber = sliceNumber + 1; endend% 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.');
Try this:
clc; % Clear the command window.
close all; % Close all figures (except those of imtool.)
imtool close all; % Close all imtool figures.
clear; % Erase all existing variables.
workspace; % Make sure the workspace panel is showing.
format longg;format compact;fontSize = 20;%===============================================================================
% Read in a standard MATLAB gray scale demo image.
folder = fileparts(which('cameraman.tif')); % Determine where demo folder is (works with all versions).
baseFileName = 'cameraman.tif';% Get the full filename, with path prepended.
fullFileName = fullfile(folder, baseFileName);% Check if file exists.
if ~exist(fullFileName, 'file') % File doesn't exist -- didn't find it there. Check the search path for it.
fullFileNameOnSearchPath = baseFileName; % No path this time.
if ~exist(fullFileNameOnSearchPath, 'file') % Still didn't find it. Alert user.
errorMessage = sprintf('Error: %s does not exist in the search path folders.', fullFileName); uiwait(warndlg(errorMessage)); return; endendgrayImage = imread(fullFileName);% Get the dimensions of the image.
% numberOfColorBands should be = 1.
[rows, columns, numberOfColorBands] = size(grayImage);if numberOfColorBands > 1 % It's not really gray scale like we expected - it's color.
% Convert it to gray scale by taking only the green channel.
grayImage = grayImage(:, :, 2); % Take green channel.
end% Display the original gray scale image.
subplot(1, 2, 1);imshow(grayImage, []);title('Original Grayscale Image', 'FontSize', fontSize);% Enlarge figure to full screen.
set(gcf, 'Units', 'Normalized', 'OuterPosition', [0 0 1 1]);% Give a name to the title bar.
set(gcf, 'Name', 'Demo by ImageAnalyst', 'NumberTitle', 'Off') % Initialize an output image.
noisyImage = grayImage; % Initialize
% Get 5,000 random locations
noiseIndexes = randperm(numel(grayImage), 5000);% Add noise
noisyImage(noiseIndexes) = 255;% Display the noisy image.
subplot(1, 2, 2);imshow(noisyImage, []);title('Noisy Image', 'FontSize', fontSize);axis on;
Best Answer