MATLAB Answers

0

How I can repeatedly divide a binary image ?

Asked by Zara Khan on 13 Apr 2019
Latest activity Commented on by Zara Khan on 23 Apr 2019 at 12:03
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?

  0 Comments

Sign in to comment.

3 Answers

Answer by 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

Actually after dividing each image I want calculate the no of white pixels of each parts then will store it in a excel sheet. I am working with 1000 dataset. So it will be 1000x no of cols
Image Analyst: what will be the easiest way ??
The best way is to pay someone

Sign in to comment.


Answer by 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

Show 1 older comment
I am using this :
q1=image(1:size(image,1)/2,1:size(image,2)/2,:);
q2=image(size(image,1)/2+1:size(image,1),1:size(image,2)/2,:);
q3=image(1:size(image,1)/2,size(image,2)/2+1:size(image,2),:);
q4=image(size(image,1)/2+1:size(image,1),size(image,2)/2+1:size(image,2),:);
But its becoming difficult when repeating the process at every steps, too many variables I need to handle. How can I loop over the process ?
Start with a small image of 16 by 16 pixels and explain step by step what you want as the output at each step.
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.


Answer by Walter Roberson
on 19 Apr 2019

  7 Comments

function splitted = rsplit4(img, sd)
[r, c, p] = size(img);
if sd <= 0 || mod(r,2) || mod(c,2)
splitted = img;
else
splitted = {rsplit4(img(1:end/2,1:end/2, :), sd-1), rsplit4(img(1:end/2,end/2+1:end, :), sd-1);
rsplit4(img(end/2+1:end,1:end/2,:), sd-1), rsplit4(img(end/2+1:end,end/2+1:end,:)), sd-1};
end
end
Now you call rsplit4 passing in the image and the maximum number of subdivisions.
can I store white pixels counts from each blocks gradully in an array format?
Like said
step 1: 16X16 will be divided into 4 equal quadrants ,now will store number of white pixels from 4 quadrants
step 2: Each 8X8 will be divided into 4 equal quadrants again , now will store number of white pixels from 4(previous) + 32(now)
For one image it will be 1X32
for 10 image ---10X32 in this format.
white pixels count from 32 blocks .
Image Analyst : No

Sign in to comment.