필터 지우기
필터 지우기

Is there an efficient and fast way to process pixel neighborhoods without loops?

조회 수: 4 (최근 30일)
Hi all, I am looking for an efficient and fast way to process local window without loops. I want to apply a nonlinear operation on the local neighborhood with an exponential function. The output of this operation is not a scalar rather than being a weight for ever pixel in the neighborhoods. Later, I use these weights to calculate the final value of the central pixel. Here is a code snippet of what I did:
for i=1:r
for j=1:c
x=i:i+wsize-1; y=j:j+wsize-1 % wsize=3 (the window size)
if(max(x)>r || (max(y)>c))
break
end
Win=im1(x,y); Win=Win(:);
C=im2(x,y); C=C(:); % current window of size wsize
avgC=mean(C);
Gij=exp(-(C-(avgC(i,j)))./C);
Wij=(G_ij)./sum(G_ij);
im3(i,j)=sum(Win.*Wij);
end
end
Note: im1 and im2 are different while the desired output will be in im3.

답변 (2개)

Image Analyst
Image Analyst 2016년 1월 26일
There is a function called nlfilter() that can apply your custom function to a moving neighborhood. I attach a demo.
  댓글 수: 2
Ahmed Elazab
Ahmed Elazab 2016년 1월 26일
Dear Image Analyst, Thanks so much for reply. I tried to use nlfilter function before but it is much slower than using the code above.
Image Analyst
Image Analyst 2016년 1월 26일
Just get rid of the loops and vectorize it. Use conv2() or imfilter().

댓글을 달려면 로그인하십시오.


Tony Richardson
Tony Richardson 2020년 7월 13일
I've written up a brief description (see the url below) of a fairly straight-forward method that I've found to be much faster that nlfilter. It does not use loops (vectorized) and still easily allows for non-linear processing of neighborhoods (for example - median processing). (nlfilter allows non-linear processing, but conv2 and imfilter do not.)

카테고리

Help CenterFile Exchange에서 Image Processing Toolbox에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by