How I can repeatedly divide a binary image ?

3 views (last 30 days)
Zara Khan
Zara Khan on 13 Apr 2019
Commented: Zara Khan on 23 Apr 2019
I want to divide a binary image into 4 equal parts first. Then each parts again to 4 parts and so on. I want to repeat this work upto certain no of times . How to do that?

Answers (3)

darova
darova on 13 Apr 2019
Use mat2cell()
clc,clear
A = imread('fig3.png');
I = im2bw(A);
k = 128; % divide matrix into 128 parts
[m,n] = size(I);
rows_rest = mod(m,k);
cols_rest = mod(n,k);
nrows = (m-rows_rest)/k *ones(1,k);
ncols = (n-cols_rest)/k *ones(1,k);
nrows(1:rows_rest) = nrows(1:rows_rest) + 1;
ncols(1:cols_rest) = ncols(1:cols_rest) + 1;
C = mat2cell(I,nrows,ncols);
  7 Comments
darova
darova on 14 Apr 2019
The best way is to pay someone

Sign in to comment.


Image Analyst
Image Analyst on 14 Apr 2019
Your image is not a power of 2.
Try this code:
clc; % Clear the command window.
clear all;
close all; % Close all figures (except those of imtool.)
workspace; % Make sure the workspace panel is showing.
format long g;
format compact;
fontSize = 16;
%===============================================================================
% Get the name of the image the user wants to use.
baseFileName = 'fig3.png';
folder = pwd;
fullFileName = fullfile(folder, baseFileName);
% Check if file exists.
if ~exist(fullFileName, 'file')
% The file doesn't exist -- didn't find it there in that folder.
% Check the entire search path (other folders) for the file by stripping off the folder.
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;
end
end
%=======================================================================================
% Read in demo image.
grayImage = imread(fullFileName);
% Get the dimensions of the image.
[rows, columns, numberOfColorChannels] = size(grayImage)
if numberOfColorChannels > 1
grayImage = grayImage(:, :, 3);
end
% Make sure it's square
if rows ~= columns
grayImage = imresize(grayImage, [rows, rows]);
% Get the dimensions of the image.
[rows, columns, numberOfColorChannels] = size(grayImage)
end
% Display image.
subplot(2, 2, 1);
imshow(grayImage, []);
impixelinfo;
axis('on', 'image');
caption = sprintf('Original image: %d rows by %d columns', rows, columns);
title(caption, 'FontSize', fontSize, 'Interpreter', 'None');
hp = impixelinfo(); % Set up status line to see values when you mouse over the image.
% Set up figure properties:
% Enlarge figure to full screen.
set(gcf, 'Units', 'Normalized', 'OuterPosition', [0 0.05 1 0.95]);
% Get rid of tool bar and pulldown menus that are along top of figure.
% set(gcf, 'Toolbar', 'none', 'Menu', 'none');
% Give a name to the title bar.
set(gcf, 'Name', 'Demo by ImageAnalyst', 'NumberTitle', 'Off')
drawnow;
% Define the function that we will apply to each block.
% First in this demo we will take the median gray value in the block
% and create an equal size block where all pixels have the median value.
% Image will be the same size since we are using ones() and so for each block
% there will be a block of 8 by 8 output pixels.
nnzFunction = @(theBlockStructure) nnz(theBlockStructure.data(:));
% Now do a loop to divide by half each time and count the number of non-zeros.
counter = 1;
newRows = rows;
newCols = columns;
while newRows >= 1
% Round sizes.
newRows = floor(newRows);
newCols = floor(newCols);
% Resize the image.
grayImage = imresize(grayImage, [newRows, newCols], 'nearest');
% Get the dimensions of the image.
[rows, columns, numberOfColorChannels] = size(grayImage)
% Show the image
subplot(2, 2, 2);
imshow(grayImage);
axis('on', 'image');
caption = sprintf('%d rows by %d columns', newRows, newCols);
title(caption, 'FontSize', fontSize);
% Count the number of non-zero pixels.
whitePixelCount(counter) = nnz(grayImage);
% Display counts so far.
subplot(2, 2, 3:4);
plot(whitePixelCount, 'b.-', 'MarkerSize', 30);
grid on;
title('White Pixel Count', 'FontSize', fontSize);
xlabel('Image number', 'FontSize', fontSize);
ylabel('Count (Number of White Pixels)', 'FontSize', fontSize);
drawnow;
% Compute half the number of rows and columns.
% May be a fractional number if the rows and columns are not a power of 2.
newRows = (rows / 2);
newCols = (columns / 2);
% Show user the results.
promptMessage = sprintf('%d white pixels in this image.\nDo you want to Continue processing,\nor Quit processing?', whitePixelCount(counter));
titleBarCaption = 'Continue?';
buttonText = questdlg(promptMessage, titleBarCaption, 'Continue', 'Quit', 'Continue');
if contains(buttonText, 'Quit')
return;
end
% Increment index for whitePixelCount array.
counter = counter + 1;
end
% Show in command window.
whitePixelCount
0001 Screenshot.png
  4 Comments
Zara Khan
Zara Khan on 19 Apr 2019
I want to set a label like :
Label 1: 16X16 will be divided into 4 equal quadrants ,now will store number of white pixels from 4 quadrants
Label 2: Each 8X8 will be divided into 4 equal quadrants again , now will store number of white pixels from 4(previous) + 32(now)
This will continue as many labels we want.
note: I am taking the complement of the 'fig3.png'

Sign in to comment.


Walter Roberson
Walter Roberson on 19 Apr 2019
  7 Comments

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!