Supposons que j'ai une matrice d'image RVB et que je souhaite y appliquer des filtres spatiaux. En général, je souhaite appliquer des opérations par élément (notez qu'il s'agit d'une affectation collégiale et que je ne suis pas autorisé à utiliser les fonctions intégrées disponibles dans la boîte à outils Traitement d'image). J'ai décidé d'écrire les filtres en tant que fonctions, puis d'appliquer bsxfun
à ces fonctions sur l'image.Comment appliquer des opérations par éléments sans utiliser de boucles et sans influencer la vitesse
Un exemple simple serait ceci:
Je veux ajouter 50 à tous les niveaux de gris d'une image, puis remplacer tous les niveaux de gris avec au-dessus de 200 à 200. Voici mon code:
a='C:\Users\sepideh\Desktop\IP_abadpour\S45C-113050518040.jpg';
b=imread(a);
b(:,:,1)=b(:,:,1)+50;
b(:,:,2)=b(:,:,2)+50;
b(:,:,3)=b(:,:,3)+50;
c=reshape(b,[],1);
d=bsxfun(@test,c,200);
test
est une fonction sous cette forme:
function Out = test(in,a)
if in>a
in=200;
end
Out = in;
end
ce code ne fonctionnera pas parce que, dans la deuxième ligne « dans> un » est une matrice ayant 0 et de 1 (je veux dire tous les éléments ne sont pas 1 et ne devrait pas être) afin que le débogueur ne se branche pas dans le e if
déclaration.
Pourriez-vous me guider comment écrire cette fonction et comment appliquer des analyses spatiales et de Fourier sur l'image, sans affecter les performances et la vitesse d'exécution?
Eh bien, la fonction que vous avez suggérée fonctionne bien, sauf que la fonction max doit être remplacée par min.Mais une autre question s'est levée. Pourquoi ma fonction ne fonctionne pas. Je veux dire que si vous arrêtez le débogueur dans la fonction, vous verrez que "in" n'est pas un scalaire et est une matrice quand le test est invoqué et vous avez dit: il n'y a rien de mal à votre fonction car elle est actuellement écrite ?? !! – sepideh
@sepideh Oh, vous avez raison, ma mauvaise! S'il vous plaît voir mon edit. –