Averaging Matrix and store it in a new matrix
Mostrar comentarios más antiguos
Assuming i have a 125x125 image. and i want to create new matrices where each point consists of the average of the surrounding 8 points and itself. but ignoring the average for the pixels on the edge for simplicity.
x = imread('image.png');
[rows,cols] = size(x);
for r = 1:rows;
for c = 1:cols;
%it does not seem working by using to inbult mean function here since its a m x n matrix i want to calculate.
end
end
so for example, i have a matrix of
x = [1 2 3 4; 5 6 7 8; 9 10 11 12;13 14 15 16]
m = x(1:3,2:4)
z = mean(x(1:3, 2:4))
---------------------------------
x =
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
m =
2 3 4
6 7 8
10 11 12
z =
6 7 8
but what i really want of z is z = (2+3+4+6+7+8+10+11+12)/9 = 7 is there anyway to do this?
1 comentario
Daniel Shub
el 18 de Mayo de 2012
Do you know what convolution or filtering is?
Respuestas (4)
Daniel Shub
el 18 de Mayo de 2012
Assuming your data x is N x M and not a color image
y = conv2(x, ones(3, 3) / 9, 'same');
6 comentarios
matlab_newbie
el 18 de Mayo de 2012
Image Analyst
el 18 de Mayo de 2012
I think Daniel meant to say 'valid' instead of 'same'. Do you want every 3x3 array, or you only want the one, single 3x3 array located between rows 1 and 3 and columns 2 and 4?
matlab_newbie
el 18 de Mayo de 2012
Sean de Wolski
el 18 de Mayo de 2012
use conv2() as daniel has done above (with the 'valid' option as ImageAnalyst pointed out)
Give it a try, you'll see that it works and learn something very powerful all at once.
matlab_newbie
el 18 de Mayo de 2012
Daniel Shub
el 18 de Mayo de 2012
@IA and Sean, I meant SAME and not VALID. While newbie wanted to ignore the edges for simplicity, I wanted to show that the edges could be handled.
Image Analyst
el 18 de Mayo de 2012
Try this:
% Get the average, avoiding any edge effects due to partial masking.
outputArray = conv2(inputArray, ones(3)/9, 'valid');
% Now get "z" which they defined as the mean
% of each column (averaging going down the rows)
z = mean(outputArray, 1);
% Get their second definition of z
% which is the mean of all the elements in their first z:
z = mean(z);
But isn't this second z just the same as
z = mean2(x(2:end-1, 2:end-1));
????? It gives a single number that is the mean of x ignoring the edge rows and edge columns.
1 comentario
matlab_newbie
el 18 de Mayo de 2012
Daniel Shub
el 18 de Mayo de 2012
Assuming you really want to do this with loops and mean, presumably for homework, you are on the correct track. Te thing you missed is the the mean of 6 7 8 is 7, the answer you want. S just replace
z = mean(x(1:3, 2:4))
with
z = mean(mean(x(1:3, 2:4)))
or even better
z = mean(m(:))
1 comentario
Sean de Wolski
el 18 de Mayo de 2012
If you have to use loops:
for ii = 1:1
y = conv2(x, ones(3, 3) / 9, 'same');
end
Categorías
Más información sobre Creating and Concatenating Matrices en Centro de ayuda y File Exchange.
Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!