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

Contribuez Discussion :

[image] Interpolation spline cubique


Sujet :

Contribuez

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut [image] Interpolation spline cubique
    Un petit bout de code pour faire une Interpolation par spline cubique.

    Par exemple pour avoir une estimation de la valeur d'un pixel de coordonnées non entiere. Utile, entre autres, dans les algos de redimensionnement


    L'oeil de Lena (Agrandissement x 10)
    A gauche: Interpolation plus proche pixel
    A droite: Interpolation spline cubique

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    /**
     * Interpolation par Spline Cubique
     * 
     * @author Xavier Philippeau
     *
     */
    public class Interpolate {
     
    	// spline factor in the range [-1,0]
    	private double a = -0.5;
     
    	// original image
    	private Channel channel = null;
     
    	public Interpolate(Channel c) {
    		this.channel = c;
    	}
     
    	// --- Spline coefficients ----------------------------------------------------
     
    	// C0(t) = -at3 + at2 
    	private double C0(double t) {
    		return -a*t*t*t + a*t*t;
    	}
     
    	// C1(t) = -(a+2)t3 + (2a+3)t2 - at 
    	private double C1(double t) {
    		return -(a+2)*t*t*t + (2*a+3)*t*t - a*t;
    	}
     
    	// C2(t) = (a+2)t3 - (a+3)t2 + 1 
    	private double C2(double t) {
    		return (a+2)*t*t*t - (a+3)*t*t + 1;
    	}
     
    	// C3(t) = at3 - 2at2 + at 
    	private double C3(double t) {
    		return a*t*t*t - 2*a*t*t + a*t;
    	}
     
    	// --- Continous interpolation from discrete values ---------------------------
     
    	// discret value for pixel of coordinates: i (integer) , j (integer)
    	private double f(int i, int j) {
    		return this.channel.getValue(i, j);
    	}
     
    	// compute interpolated value for pixel of coordinates: x (real) , j (integer)
    	private double H(int j, double x) {
    		int i = (int)x;
    		return f(i-1,j)*C3(x-i) + f(i,j)*C2(x-i) + f(i+1,j)* C1(x-i) + f(i+2,j)*C0(x-i);
    	}
     
    	// compute interpolated value for pixel of coordinates: x (real) , y (real)
    	public double value(double x, double y) {
    		int j = (int)y;
    		return H(j-1,x)*C3(y-j) + H(j,x)*C2(y-j) + H(j+1,x)*C1(y-j) + H(j+2,x)*C0(y-j);
    	}
    }
    NB: Comme toujours, ce code est volontairement non optimisé. Pour info, on peut diviser par deux le nombre de multiplications, et egalement précalculer les valeurs des coefficients...
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 19
    Par défaut
    Est ce que tu connaitrais une façon d'utiliser les splines cubiques mais pas dans un cas de redimensionnement mais pour interpoler des pixels manquant? En gros il s'agirait de faire une sorte d'inpainting mais sans réutiliser les pixels interpolés. Tu penses que c'est faisable?

  3. #3
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Interpolation par spline cubique.
    Oui, j'ai regardé ton code vite fait, il y aurait moyen d'optimiser un peu (au niveau du calcul de t, t*t , t*t*t ).

    Tu pourras nous mettre la matrice associée, stp

  4. #4
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par PRomu@ld
    Tu pourras nous mettre la matrice associée, stp
    Les fonctions etaient deja indiquées sous forme de commentaire dans le code, mais pour te faire plaisir:

    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
     
    Fonctions de base:
     
    C3(t) = at3 - 2at2 + at
    C2(t) = (a+2)t3 - (a+3)t2 + 1
    C1(t) = -(a+2)t3 + (2a+3)t2 - at
    C0(t) = -at3 + at2
     
     
    Forme matricielle
     
                  |  a  ,   a+2  , -(a+2) , -a |   | P(i-1) |
    |t3 t2 t 1| x | -2a , -(a+3) ,  2a+3  ,  a | x | P(i)   |
                  |  a  ,    0   ,   -a   ,  0 |   | P(i+1) |
                  |  0  ,    1   ,    0   ,  0 |   | P(i+2) |
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  5. #5
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Merci beaucoup.

    Les fonctions etaient deja indiquées sous forme de commentaire dans le code,
    C'était pour ne pas forcément avoir à mettre le nez dans le code.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 19
    Par défaut
    Et pour ma question vous auriez une réponse?

Discussions similaires

  1. Interpolation spline cubique
    Par black_hole dans le forum Traitement d'images
    Réponses: 1
    Dernier message: 21/02/2011, 10h50
  2. interpolation spline cubique
    Par chamac79 dans le forum C++
    Réponses: 4
    Dernier message: 29/04/2009, 17h20
  3. interpolation spline cubique en c++
    Par mehdinirvana dans le forum C++
    Réponses: 3
    Dernier message: 06/03/2009, 11h52
  4. Interpolation par spline cubique
    Par arm3366 dans le forum MATLAB
    Réponses: 2
    Dernier message: 07/02/2008, 12h59

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