Is there an efficient and fast way to process pixel neighborhoods without loops?
1 vue (au cours des 30 derniers jours)
Afficher commentaires plus anciens
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.
0 commentaires
Réponses (2)
Image Analyst
le 26 Jan 2016
There is a function called nlfilter() that can apply your custom function to a moving neighborhood. I attach a demo.
2 commentaires
Tony Richardson
le 13 Juil 2020
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.)
0 commentaires
Voir également
Catégories
En savoir plus sur Image Processing Toolbox dans Help Center et File Exchange
Produits
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!