Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5
  1. #1
    Candidat au titre de Membre du Club
    Femme Profil pro
    Inscrit en
    février 2009
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : février 2009
    Messages : 117
    Points : 14
    Points
    14

    Par défaut Contour image par Fourier

    bonjour voila mon code pour détecter les contours d'une image par le descripteur de Fourier, sauf que le résultat j'ai une image tout en blanc, quelqu'un peut m’éclaircir cela?

    voici mon code
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    image=imread('c:\boum.jpg');
    F = fft2(image);
    mag = sqrt(real(F).^2 + imag(F).^2);
    phase = atan(imag(F)./real(F));
    
    re = sqrt((mag.^2)./(1 + tan(phase).^2));
    im = re.*tan(phase);
    F = re + i*im;
    f = ifft2(F);
    
    subplot(1,2,1);
    imshow(image);
    Title('Original Image');
    
    subplot(1,2,2);
    imshow(f);
    Title('Image after forward and backward FFT');
    y = f;

  2. #2
    Responsable FAQ C++
    Avatar de Winjerome
    Homme Profil pro Jérôme
    Inscrit en
    septembre 2009
    Messages
    7 961
    Détails du profil
    Informations personnelles :
    Nom : Homme Jérôme
    Âge : 27
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : septembre 2009
    Messages : 7 961
    Points : 29 317
    Points
    29 317

    Par défaut

    Bonjour,

    image est déjà le nom d'une fonction MATLAB, chose à éviter. Je t'invite à consulter ceci.

    La sortie de la fonction ifft2 et complexe je te rappelle.

    Pour l'affichage, voir Pourquoi imshow affiche une image toute blanche et/ou noire ?
    Avant de poser votre question : FAQ, Tutoriels et recherche sur le forum
    Une erreur ? Messages d'erreur et avertissements
    "Ça ne marche pas" n'apporte aucune information utile permettant de vous aider. Expliquez clairement votre problème (erreurs entières, résultat souhaité vs obtenu...).

    En essayant continuellement on finit par réussir. Donc: plus ça rate, plus on a de chance que ça marche. - Jacques Rouxel
    L'expérience, c'est le nom que chacun donne à ses erreurs - Oscar Wilde
    Retrouvez-moi en soirée sur le chat de developpez.com - Pas de question technique par MP, Merci

  3. #3
    Candidat au titre de Membre du Club
    Femme Profil pro
    Inscrit en
    février 2009
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : février 2009
    Messages : 117
    Points : 14
    Points
    14

    Par défaut

    merci Winjerome pour ta réponse

    je me suis trompée de code voila
    Code :
    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
    %function fd = fourierdesc(img)
    oimg=('c:\boum.jpg');
    n=size(img)
    b=I;
    % edge detection robert gradien
    a=double(I);
    for x=2:n(1)-1
    for y=2:n(2)-1
    c=abs(a(x+1,y+1) - a(x,y))+ abs(a(x+1,y) - a(x,y+1)) ;
    b(x,y)=c;
    end
    end
    figure, imshow(b)
    Title('roberts cross gradien result');
    
    % count the fourier descriptor
    
    I=im2bw(b);
    cd=I
    [rows cols] = find(I~=0)
    
    % Find a starting point on the boundary
    
    nf=input('input the boundary points :');
    [rows cols] = find(I~=0);
    contour = bwtraceboundary(I, [rows(1), cols(1)], 'N');
    
    % complex number format (x + jy)
    sampleFactor = length(contour)/nf;
    dist = 1;
    for i=1:nf
    c(i) = contour(round(dist),2) + j*contour(round(dist),1);
    dist = dist + sampleFactor;
    end
    C = fft(c)
    Capprox = C;
    % Take inverse fft
    cifft = ifft(Capprox);
    
    % Show original boundary and approximated boundary
    figure
    imshow(imcomplement(bwperim(I)));
    title('image result');
    hold on, plot(cifft,'r');
    je sais qu'il fait la détection de contours par gradient de Robert mais est-ce qu'il le fait par Fourier?

  4. #4
    Membre chevronné
    Avatar de Kangourou
    Profil pro
    Inscrit en
    mars 2003
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2003
    Messages : 472
    Points : 661
    Points
    661

    Par défaut

    salut,

    si la question c'est pour les images qui apparaissent blanches, il faut rajouter des crochets à imshow
    Ensuite j'ai l'impression qu'il y a 3 problèmes dans la question :
    1. Appliquer un filtre a l'image pour trouver les contours
    2. trouver des pixels voisins qui forment une chaîne (boucle)
    3. "lisser" le polygone formé par les pixels


    La détection des contours (point 1) se fait très bien par Roberts (ou Prewitt, ou Sobel...)
    Pour Fourier, il me semble que ça s'applique plus au troisième point non ?

    Où est le problème exactement ?

    a+

  5. #5
    Candidat au titre de Membre du Club
    Femme Profil pro
    Inscrit en
    février 2009
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : février 2009
    Messages : 117
    Points : 14
    Points
    14

    Par défaut

    c'est bon , c'été juste une question de lecture je me suis trompée
    merci pour vos réponses

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •