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 :

Calcul rapide d'un histogramme conjoint de deux images


Sujet :

Images

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Décembre 2011
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 52
    Points : 34
    Points
    34
    Par défaut Calcul rapide d'un histogramme conjoint de deux images
    Bonsoir à tous,

    Dans le cadre du recalage d'images, je dois calculer l'histogramme conjoint de deux images (cad que, pour deux images ayant une zone de recouvrement, histo(i,j) contient le nombre d'occurences où la première image a l'intensité i et la deuxième image l'intensité j.

    Pour ce faire, je boucle sur les intensités:

    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
        clear all; close all; clc
     
        M = 1024;
        N = 1024;
     
        world_map=NaN(M,N,2);
     
        rail_1 = rgb2gray(imread('img2.bmp'));
     
        % Je décale l'une des images
        dx = 12;
        dy = 15;
     
        [M1,N1] = size(rail_1);
     
        % Je centre ma première image sur la carte globale
        world_map(floor(M/2-M1/2):floor(M/2+(M1/2-1)),floor(N/2-N1/2):floor(N/2+(N1/2-1)),1) = rail_1;
     
        % Je décale la seconde image sur la carte globale
        world_map(floor(M/2-M1/2-dx):floor(M/2+(M1/2-1-dx)),floor(N/2-N1/2-dy):floor(N/2+(N1/2-1)-dy),2) = rail_1;
     
     
        figure
        h1=imagesc(world_map(:,:,1));
        hold on
        h2=imagesc(world_map(:,:,2));
        set(h2,'AlphaData',0.5)
        colormap gray
     
        % je recherche la zone de recouvrement
        overlap = find(~isnan(world_map(:,:,1)) & ~isnan(world_map(:,:,2)));
        rail_1 = world_map(:,:,1);
        rail_2 = world_map(:,:,2);
     
        % je calcule l'histogramme
        histo = zeros(256,256);
     
        for i=1:256
            for j=1:256
     
                histo(i,j) = numel(find(rail_1(overlap)==i-1 & rail_2(overlap)==j-1));
     
            end
        end

    Cependant, cet algo est bien trop long pour l'utilisation que je vais en faire... J'ai bien essayé de supprimer les boucles for mais je ne vois pas comment y remédier.

    J'espère que vous pourrez me venir en aide

    Bonne soirée.

  2. #2
    Membre éclairé
    Avatar de Kangourou
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    579
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 579
    Points : 859
    Points
    859
    Par défaut
    salut,

    Il s'agit de deux boucles imbriquées, ce sont des choses qui arrivent même avec Matlab ! surtout quand on travaille sur des images. Est ce que le problème vient du temps de calcul ?

    je suis un peu sceptique sur le contenu de la double boucle. L'idée est de comparer tous les couples d'intensités, donc une boucle sur i et j semble pertinente. Mais tu travailles sur le contenu du tableau 'overlap', qui a priori contient des indices linéaires. A priori ca marche, mais on doit pouvoir optimiser. En particulier, je ferais une boucle sur les positions communes (données par la variable 'overlap'), et j'incrémenterais le tableau en fonctions des valeurs dans chaque image.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        for k = 1:length(overlap)
            ind = overlap(k);
            i = rail_1(ind) + 1;
            j = rail_2(ind) + 1;
            histo(i,j) = histo(i,j) + 1;
        end

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur en science de l'environnement
    Inscrit en
    Août 2013
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur en science de l'environnement

    Informations forums :
    Inscription : Août 2013
    Messages : 97
    Points : 149
    Points
    149
    Par défaut
    Je te conseil de regarder:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    values = unique(x);
    instances = histc(x,values); %nombre d'occurence de value.
    doc histc
    ça devrait considérablement augmenter la vitesse de ton algo

Discussions similaires

  1. Calcul rapide des valeurs propres d'une matrice creuse
    Par gsagnol dans le forum Mathématiques
    Réponses: 3
    Dernier message: 21/12/2007, 23h37
  2. Calcul erreur entre deux images noir et blanc
    Par b4sols dans le forum Images
    Réponses: 1
    Dernier message: 22/03/2007, 08h59
  3. Calcul rapide de percentiles
    Par benj63 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 08/12/2006, 14h50
  4. Réponses: 1
    Dernier message: 10/08/2006, 14h43
  5. Calcul rapide d'une exponentielle ?
    Par progfou dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 13/04/2006, 21h12

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