Averaging Matrix and store it in a new matrix
显示 更早的评论
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 个评论
Daniel Shub
2012-5-18
Do you know what convolution or filtering is?
回答(4 个)
Daniel Shub
2012-5-18
Assuming your data x is N x M and not a color image
y = conv2(x, ones(3, 3) / 9, 'same');
6 个评论
matlab_newbie
2012-5-18
Image Analyst
2012-5-18
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
2012-5-18
Sean de Wolski
2012-5-18
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
2012-5-18
Daniel Shub
2012-5-18
@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
2012-5-18
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.
Daniel Shub
2012-5-18
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 个评论
Sean de Wolski
2012-5-18
If you have to use loops:
for ii = 1:1
y = conv2(x, ones(3, 3) / 9, 'same');
end
类别
在 帮助中心 和 File Exchange 中查找有关 Creating and Concatenating Matrices 的更多信息
产品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!