How I can repeatedly divide a binary image ?
2 次查看(过去 30 天)
显示 更早的评论
回答(3 个)
darova
2019-4-13
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 个评论
Image Analyst
2019-4-14
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
4 个评论
Image Analyst
2019-4-18
Start with a small image of 16 by 16 pixels and explain step by step what you want as the output at each step.
Walter Roberson
2019-4-19
Code for repeatedly dividing was provided at https://www.mathworks.com/matlabcentral/answers/456856-how-can-i-loop-over-a-binary-image-to-get-4-equal-quadrants-always#answer_371003
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Computer Vision with Simulink 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!