[Matlab] fonctionnement de imresize

Résolu/Fermé
Enna7 Messages postés 40 Date d'inscription jeudi 14 décembre 2006 Statut Membre Dernière intervention 3 avril 2012 - 4 déc. 2008 à 15:48
Fee Fay Messages postés 635 Date d'inscription vendredi 17 octobre 2008 Statut Membre Dernière intervention 31 mai 2009 - 5 déc. 2008 à 14:10
Bonjour ,

Je travaille en ce moment sur un programme sous matlab qui permet de reconstruire une image. Le principe est celui de déconvolution et j'utilise les transformées de fourier. Pour essayer de faire simple :

I * F = P

J'ai une image I que je convolue par un filtre F ce qui me donne une projection P. Mon but est de revenir à mon image initiale à partir de ma projection P. De manière directe avec les transformées de Fourier, ça marche y'a pas de soucis. D'un point de vue expérimental, je doit tenir compte d'un facteur de grossissement "alpha". Toujours pour simplifier, ma projection est en fait le résultat de la convolution de l'image par un filtre, mais le filtre "voit" l'image (l'objet) à une certaine distance et projette l'image à une autre distance (sur un détecteur).

Mon idée première était de remettre le filtre "à l'échelle", c'est à dire me remetre dans le cas de base ou l'image, le filtre et la projection sont "dans le même plan". J'ai donc utiliser un imresize sur mon filtre du facteur nécessaire (ici 2.4)!

new_F=imresize(F,2.4,'nearest')

1/ La déconvolution fonctionne correctement avec cette méthode, c'est à dire que je retrouve bien mon objet O cependant, ma première question est alors comment le imresize agit sur le filtre. Car on peut pas avoir des morceaux de pixel... et 2.4 n'est pas un entier... et si on a une taille de filtre de 139, la taille finale sera de 333.6 ce qui sera arrondi à 334... mais comment sont redispatchés les pixels ? Est-ce que ça induit une transformation du filtre ?

2/ Pour ne pas avoir ce problème excistentielle concernant des morceaux de pixel, je me suis dit qu'il suffisait alors de mulitiplié dans mon exemple le filtre par 24 et la projection par 10 pour garder le rapport de 2.4 entre les deux et en m'affranchissant du probleme...

new_F=imresize(F,24,'nearest')
new_P=imresize(P,10,'nearest')

Sauf que là, ma déconvolution ne fonctionne plus... et je comprends pas pourquoi !!! Multiplié mon filtre F par 2.4 ou multiplié mon filtre F par 24 et ma projection P par 10 ça devrait revenir à la même chose non ?


Une idée ? un conseil ?

Merci pour votre aide !

Enna7

3 réponses

Fee Fay Messages postés 635 Date d'inscription vendredi 17 octobre 2008 Statut Membre Dernière intervention 31 mai 2009 375
4 déc. 2008 à 22:29
Bonsoir

Difficile de faire passer un problème sorti de tout ce qu'il y a normalement autour. :-D
Cela dit, je trouve que c'est bien expliqué ; comme ce n'est pas du tout mon domaine, j'espère que je ne raconterais pas de conneries. :-(
Je vais parler en terme de convolution puisque c'est comme cela que je le vois, je n'ai jamais fait de cochonneries avec des images moi ! 8-)
Si tu convoles I et F pour obtenir P, si tu fais un imresize du filtre F, je pense qu'il faut aussi que tu fasses un imresize de I avant de la filtrer (c'est ce que tu as dû faire).
Le résultat obtenu sera effectivement P dont il faudra faire un imresize mais pas d'un facteur 10, je dirais plutôtd'un facteur 0.1 (mais on en revient à la question existentielle :-D), de plus, en prenant en compte la double intégrale donnant le résultat d'une convolution en 2D, le changement de variable implique que le résultat P obtenu sera multiplié par un facteur 100, il faudra donc diviser par 100.
Voilà, j'espère que c'est bien ça

Quant à la façon dont Matlab fonctionne pour les interpolations d'images, il faudrait se plonger en détails là-dedans - ce que je n'ai jamais fait - et on y trouverait très certainement une réponse cartésienne à ce phénomène paranormal de moceaux de pixels :-DDD
Mais pour résumer, je ne sais pas. :-(

Bonne nuit
0
Enna7 Messages postés 40 Date d'inscription jeudi 14 décembre 2006 Statut Membre Dernière intervention 3 avril 2012 9
5 déc. 2008 à 11:50
Hello ^^

Merci pour ta réponse !

Alors je vais essayer d'expliquer encore mieux. En fait expérimentalement j'ai un objet (I) que j'observe à travers un filtre spécial (F), et je récupère l'image ainsi projetée (P) sur un détecteur.

Le Filtre me transforme l'image initiale comme une convolution : I * F = P. Mon but est de revenir à cette image initiale I à partir de ma projection P. Je fais en fait I=P/F. P est la projection sur mon détecteur, et F le filtre que je connais. Évidement on ne peut pas faire ce calcul directement, c'est pour ça que j'utilise les transformées de Fourier pour faire une convolution inverse.

Quand l'image, le filtre et la projection sont "à la même échelle" y'a pas de soucis ça fonctionne.

Sauf que comme j'essaie de l'expliquer, expérimentalement, l'objet le filtre et le détecteur ne sont pas les uns sur les autres mais l'objet est à une distance d1=10 du filtre, et le filtre à une distance d2=24 du détecteur. L'image projetée sur le détecteur est donc représentée avec un grandissement (d2/d1=2.4).

Pour en tenir compte juste je faisais juste un imresize sur le filtre... il manque donc un imresize ou sur la projection ou sur l'image pour que les trois soient dans le meme plan.

J'ai réessayé avec un imresize de 24 sur le filtre, de 10 sur la projection, et il faut que je fasse un imresize de 0.076 pour retrouver l'image d'origine... lorsque j'ai un grandissement de 2.4...

Je comprends donc pourquoi tu me dis qu'il faut que j'utilise un facteur 0.1... mais d'un je comprend pas pourquoi la valeur est de 0.076 alors qu'elle devrait être de 0.1 comme tu le dis ... Ensuite, quand tu écris "en prenant en compte la double intégrale donnant le résultat d'une convolution en 2D, le changement de variable implique que le résultat P obtenu sera multiplié par un facteur 100, il faudra donc diviser par 100. "

là je comprends pas... comme je suis en 2D il faut que je divise deux fois par 10 si je fais un imresize de 10 sur ma projection ?

En gros si on se met dans le "plan de la projection" ça revient à dire : I'=P/(F*2.4)=(P*10)/(F*24) et I'=100*I dou un imresize de 100 sur l'image reconstruite ?

Et effectivement j'ai toujours mon problème existentiel sur la gestion des décimaux par imresize... ;)

Merci pour l'aide en tout cas!

Enna.
0
Fee Fay Messages postés 635 Date d'inscription vendredi 17 octobre 2008 Statut Membre Dernière intervention 31 mai 2009 375
5 déc. 2008 à 14:10
Bonjour
Merci pour le complément d'informations ;-)

En fait je vais expliquer ce à quoi je pensais avec des formules, ce sera plus simple.
Mathématiquement, je comprends ce que tu m'as écrit comme quelque chose de ce type :
P(x)=∫∫I(y)F(y-x)dy
Donc, si on fait un imresize de 1/α du filtre F, cela revient à considérer le filtre G(x)=F(αx).
A l'aide du filtre G et de l'imresize de J(x)=I(αx) de I, on peut obtenir l'imresize Q(x)=P(αx) de P :
∫∫J(y)G(y-x)dy = ∫∫I(αy)F(α(y-x))dy
En faisant le changement de variable y'=αy on a dy'=α²dy et donc :
∫∫J(y)G(y-x)dy = (1/α²)*∫∫I(y)F(y-αx)dy
∫∫J(y)G(y-x)dy = (1/α²)*P(αx)
α²Q(x) = ∫∫J(y)G(y-x)dy

Voilà ce que je voulais dire.
Donc, comme on obtient α²Q par cette méthode, je me disais qu'il fallait faire un imresize du résultat Q par 1/α pour obtenir P :
α²Q(x/α) = α²P(αx/α) = α²P(x)
Puis diviser par α² :
P(x) = (1/α²)α²P(x)

Maintenant, quant à savoir pourquoi 0.076... ce n'est pas toujours évident de manipuler les TF, elles ne sont pas normalisées partout pareil dans les livres, dans les programmes non plus, de plus avec la TF discrète, il y a le facteur qui dépend du nombre d'éléments du vecteur, etc, etc... tu as peut-être juste un problème de facteur lors du calcul de tes TF.
Voilà, je crois que je ne vais pas pouvoir beaucoup faire plus, je n'ai pas d'autres idées sur la question.

Bonne journée
0