2D sliding/moving/running average window
古いコメントを表示
Hello, I want to perform a matrix 'patch' moving average but I am not sure how to. So, for example, defining my moving window as 3 x 3. I would like, for each element in the matrix, to perform the average of the elements as in the sequence below (excerpt) for an exemplary 6 x 10 matrix. I know this can be done more efficiently through the use of conv2 or in frequency domain with fft2, using the window kernel, but I still want to do it with a for loop, as this will be later translated to another real time language code. In addition, I would like to be able to select the elements as a 1D array (a reshape of the n_rows, n_cols matrix). At the edges of the matrix I select the next row, so it probably makes more sense to do it as a 1D array. Finally, when reaching the end of the matrix I can only select a few elements in the corner, but in this case I will do the average just of those elements.
thanks!!

2 件のコメント
Matt J
2022 年 7 月 30 日
I know this can be done more efficiently through the use of conv2 or in frequency domain with fft2, using the window kernel, but I still want to do it with a for loop
It sounds like you already know how you're going to do it, so there doesn't seem to be a question here.
Albert Zurita
2022 年 7 月 30 日
採用された回答
その他の回答 (2 件)
David Hill
2022 年 7 月 30 日
a=randi(100,15);%whatever initial size of your matrix
b=size(a,1);
m=zeros(b);
for x=1:b^2
idx=[x-b-1,x-1,x+b-1;x-b,x,x+b;x-b+1,x+1,x+b+1];
if idx(2,3)>b^2
idx(:,3)=[];
end
if mod(idx(3,2),b)==1
idx(3,:)=[];
end
if idx(2,1)<1
idx(:,1)=[];
end
if mod(idx(1,2),b)==0
idx(1,:)=[];
end
m(x)=mean(a(idx),'all');
end
3 件のコメント
Albert Zurita
2022 年 7 月 30 日
Image Analyst
2022 年 8 月 24 日
Albert, did you even see my answer below? Please read it. It does what you asked. You can specify the image file and window size and is 100% manual (non-vectorized). At least give it a try even if you prefer Bruno's answer (which has vectorized indexing).
Albert Zurita
2022 年 8 月 25 日
Image Analyst
2022 年 7 月 31 日
編集済み: Image Analyst
2022 年 8 月 24 日
0 投票
See my attached "manual" convolution demo. It lets you pick a standard demo image (converts to gray scale if necessary) and then asks you for the number of rows and columns in the scanning filter window (kernel). Then it has a 4-nested for loop where it sums the image pixel times the kernel value. It also counts the number of pixels in the kernel that overlap the image so in essence it shrinks the window when it "leaves the image" by ignoring those pixels. So if the 3x3 kernel is centered over (1,1) only 4 pixels are considered rather than the full 9 because 5 pixels are off the image and don't overlap. The input image and output image are displayed side by side. It does not use any MATLAB convolution functions or vectorized indexing to get any of the pixels in the window so it's completely 100% manual.
カテゴリ
ヘルプ センター および File Exchange で Loops and Conditional Statements についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!



