IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Images Discussion :

Noyau d'interpolation personnalisé


Sujet :

Images

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 17
    Points : 9
    Points
    9
    Par défaut Noyau d'interpolation personnalisé
    Bonjour,

    Après quelques heures à me prendre la tête avec Matlab et à chercher sur la toile, je me tourne vers vous. J'ai besoin de redimensionner un certain nombre d'images mais ce de manière très contrôlée. J'ai donc codé ça moi même mais Matlab est réputé pour être très, très mauvais dès qu'il y a des boucles for en jeu, j'ai donc tenté de faire la même chose avec la fonction prévue pour ça dans Matlab, à savoir imresize.

    Avec imresize j'aimerai pouvoir faire quelque chose de ce type IMNEW(i,j)=sum(2i+k,2j+l)*f(k,l) avec k et l entre -2 et 2 et f un noyau d'interpolation du type :
    f =
    0.0069 0.0208 0.0278 0.0208 0.0069
    0.0208 0.0625 0.0833 0.0625 0.0208
    0.0278 0.0833 0.1111 0.0833 0.0278
    0.0208 0.0625 0.0833 0.0625 0.0208
    0.0069 0.0208 0.0278 0.0208 0.0069

    En fouillant la doc de imresize, il ne me semble pas possible de lui donner un noyau de convolution sous forme de matrice. Il semble que l'on puisse passer des choses de cette forme en argument :
    {f,w}, that specifies a custom interpolation kernel. In this cell array, f is a function handle for a custom interpolation kernel and w is the width of the custom kernel

    J'ai essayé de créer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     boxKernel = @(x)((-2.5 <= x) & (x < -1.5))*f(1,floor(x+2.5))+((-1.5 <= x) & (x < -0.5))*f(1,floor(x+2.5))+((-0.5 <= x) & (x < 0.5))*f(1,floor(x+2.5))+((0.5 <= x) & (x < 1.5))*f(1,floor(x+2.5))+((1.5 <= x) & (x < 2.5))*f(1,floor(x+2.5));
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      boxKernel = @(x)(x==-2)*f(1,floor(x+2.5))+(x==-1)*f(1,floor(x+2.5))+(x==0)*f(1,floor(x+2.5))+(x==1)*f(1,floor(x+2.5))+(x==2)*f(1,floor(x+2.5));
    Avec x=5. Mais cela ne donne pas exactement le même résultat. Je me tourne donc vers vous, je ne vois plus quoi faire, j'espère que vous pourrez m'aider. Merci beaucoup

    Bonne après midi



    Ps: voici le code fonctionnel que j'aimerai imiter avec imresize.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    for l = 1:(n-1)
         tx=(tx-1)/2+1;
         ty=(ty-1)/2+1;
         for i = 1:tx
             for j = 1:ty
                 sf=0;
                for p = 1:5
                     for q = 1:5
                        sf=sf+f(p,q)*x_gpyr(max(min(tx*2-1,2*i+p-3),1),max(min(ty*2-1,2*j+q-3),1),l);
                     end
                 end
                 x_gpyr(i,j,l+1)=sf;
             end
         end
    end

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    J'ai finis par trouver la solution tout seul en contournant totalement le problème et en jouant sur le fait que mes dilatations se font à un rapport 2. J'utilise donc imfilter pour filtrer l'image avec mon beau noyau de convolution puis je ne garde que les coefficients utiles (au prix d'un rapport 4 sur le temps d’exécution). Pour agrandir c'est un tout petit peu plus complexe, il faut arranger son filtre en quatre filtres secondaires qui "se calent bien sur les coefficients entiers de l'ancienne matrice", il vaut mieux faire un petit dessein.

    Voici le code qui vaut mieux qu'un long discours :

    Pour le rétrécissement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    prov=imfilter(x_gpyr(1:(tx-1)*2+1,1:(ty-1)*2+1,l),f);
    x_gpyr(1:tx,1:ty,l+1)=prov(1:2:end,1:2:end);
    Pour l'agrandissement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    f1=4*[f(1,1) f(1,3) f(1,5);f(3,1) f(3,3) f(3,5);f(5,1) f(5,3) f(5,5)];
    f2=4*[f(1,2) f(1,4);f(3,2) f(3,4); f(5,2) f(5,4)];
    f3=4*[f(2,1) f(2,3) f(2,5); f(4,1) f(4,3) f(4,5)];
    f4=4*[f(2,2) f(2,4) ;f(4,2) f(4,4)];
    prov1=imfilter(x(1:(tx-1)/2+1,1:(ty-1)/2+1),f1);
    prov2=imfilter(x(1:(tx-1)/2,1:(ty-1)/2+1),f2);
    prov3=imfilter(x(1:(tx-1)/2+1,1:(ty-1)/2),f3);
    prov4=imfilter(x(1:(tx-1)/2,1:(ty-1)/2),f4);
    y(1:2:tx,1:2:ty)=prov1(:,:);
    y(2:2:tx,1:2:ty)=prov2(:,:);
    y(1:2:tx,2:2:ty)=prov3(:,:);
    y(2:2:tx,2:2:ty)=prov4(:,:);
    En espérant que ça aide un jour, bonne soirée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [FLASH MX] Interpolations de formes
    Par SamDaKap dans le forum Flash
    Réponses: 7
    Dernier message: 13/04/2005, 16h12
  2. une interpolation de forme est elle possible
    Par tetsuo chima dans le forum Flash
    Réponses: 3
    Dernier message: 07/10/2003, 16h31
  3. Noyau
    Par wincroc dans le forum Administration système
    Réponses: 2
    Dernier message: 03/07/2003, 08h33
  4. Recompilation du noyau
    Par keikoz dans le forum Administration système
    Réponses: 7
    Dernier message: 17/02/2003, 23h54
  5. Primitive du noyau
    Par freud dans le forum Programmation d'OS
    Réponses: 5
    Dernier message: 25/11/2002, 03h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo