How to process a 'function' that take inputs as blocks from two matrices

Suppose there are two matrices A and B of size 6 x 6 (small size for convenience). If there is a function say, mat which takes inputs 'a' and 'b' as bocks of size 3 x 3 from A and B respectively. For instance, if function mat adds the corresponding elements of blocks a and b, then how to process this function on both the images A and B using 'blockproc' (perhaps) or any other method.
Note: Actually, A and B are gray scale images, and the function mat embeds the pixels of block 'b' into block 'a' (by pixel difference technique).

 Respuesta aceptada

mat = @(a,b) double(a) + double(b);
%assuming that the matrices are perfect multiples of the block size:
BS = 3;
Ac = mat2cell(A, BS * ones(1,size(A,1)/BS), BS * ones(1,size(A,2))/BS, size(A,3));
Bc = mat2cell(B, BS * ones(1,size(B,1)/BS), BS * ones(1,size(B,2))/BS, size(B,3));
resultc = cellfun(mat, Ac, Bc);
result = cell2mat(resultc); %careful it is double not uint8

3 comentarios

Thanks for your reply.
But when I run the above code by taking A and B of size 6 x 6, I am getting the following error:
Error using cellfun
Non-scalar in Uniform output, at index 1, output 1.
Set 'UniformOutput' to false.
Also, I am not clear why you have taken BS (block size) = 3, instead of 3 x 3 size.
mat = @(a,b) double(a) + double(b);
%assuming that the matrices are perfect multiples of the block size:
BSvert = 3;
BShorz = 3;
Ac = mat2cell(A, BSvert * ones(1,size(A,1)/BSvert), BSvert * ones(1,size(A,2))/BSvert, size(A,3));
Bc = mat2cell(B, BShorz * ones(1,size(B,1)/BShorz), BShorz * ones(1,size(B,2))/BShorz, size(B,3));
resultc = cellfun(mat, Ac, Bc, 'uniform', 0);
result = cell2mat(resultc); %careful it is double not uint8
BS was taken as 3 instead of 3 x 3 because the same block size was used for horizontal and vertical.
In this version of the code I used different variables for the two so that you could (if you wanted) use a different horizontal and vertical block size.
This works.
Thanks.
One more thing: Can functon blockproc be used here?

Iniciar sesión para comentar.

Más respuestas (0)

Preguntada:

el 31 de Ag. de 2020

Comentada:

el 31 de Ag. de 2020

Community Treasure Hunt

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

Start Hunting!

Translated by