The following does the trick

fun = @(block_struct) max(block_struct.data(:));

b = blockproc (a, [X Y], fun);

127 views (last 30 days)

Show older comments

Kannan U V
on 6 Jul 2018

Matt J
on 6 Jul 2018

But it is not very efficient. Compare:

a=rand(5000);

X=4; Y=4; %window sizes

tic

fun = @(block_struct) max(block_struct.data(:));

b = blockproc (a, [X Y], fun);

toc

%Elapsed time is 19.764354 seconds.

tic

b=sepblockfun(a,[X,Y],'max');

toc

%Elapsed time is 0.092457 seconds.

It is probably in fact the least efficient approach you could use. Even a double for-loop is faster:

tic;

[m,n]=size(a);

ex=ones(1,m/X)*X;

ey=ones(1,n/Y)*Y;

ac=mat2cell(a,ex,ey);

for i=1:m/X

for j=1:n/Y

ac{i,j}=max(ac{i,j}(:));

end

end

b=cell2mat(ac);

toc

%Elapsed time is 6.203763 seconds.

Matt J
on 6 Jul 2018

Edited: Matt J
on 6 Jul 2018

What is the most efficient way of computing it without going into for loops

X=2; Y=2; %window sizes

maxpool=sepblockfun(yourImage,[X,Y],'max');

This assumes the image dimensions m,n are evenly divisible by X,Y respectively. Otherwise, you must pad the image to make it so.

Anton Semechko
on 5 Jul 2018

Edited: Anton Semechko
on 5 Jul 2018

Here is an example:

% Sample image

im=imread('cameraman.tif'); % sample image

% 4 pixels comprising non-overlapping 2-by-2 neighbourhoods

im_nw=im(1:2:end,1:2:end);

im_sw=im(2:2:end,1:2:end);

im_se=im(2:2:end,2:2:end);

im_ne=im(1:2:end,2:2:end);

% Select pixel with maximum intensity

im_max=max(cat(3,im_nw,im_sw,im_se,im_ne),[],3);

% Visualize

figure('color','w')

ha=subplot(1,2,1);

imshow(im,imref2d(size(im)))

title(ha,'original','FontSize',20)

ha=subplot(1,2,2);

imshow(im_max,imref2d(size(im_max)))

title(ha,'2x2 max-pool','FontSize',20)

Note that even though two images appear to have the same size when visualized using 'imshow', the dimensions of im_max are half that of im. Recursive application of 2-by-2 max-pool will result in downsampled images with sizes 1/2, 1/4, 1/8, etc. of the original image.

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

Start Hunting!