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 :

Filtrer une image avec des NaN [Débutant]


Sujet :

Images

  1. #1
    Débutant
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 193
    Points : 58
    Points
    58
    Par défaut Filtrer une image avec des NaN
    Bonjour

    je dois filtrer une image avec des filtres moyenneurs

    aprés avoir créé mon filtre, j'utilise la fonction imfilter mais j'ai un souci avec les NaN de ma matrice à filtrer

    dés que le filtre 3*3 rencontre une valeur NaN, le résultat est NaN alors que l'idéal serait qu'il filtre l'image (sans tenir compte des NaN) et qu'il mette des NaN juste aux valeurs NaN de départ.

    dans l'aide, la fonction nanmean n'est pas la bonne

    voilà un exemple

    matrice de départ
    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
        92    99     1     8    15   NaN    74    51    58    40
     
        98    80     7    14    16    73    55    57    64    41
     
         4    81    88   NaN    22    54    56    63   NaN    47
     
        85    87    19    21     3    60   NaN    69    71    28
     
        86    93    25     2     9    61    68    75    52    34
     
        17    24    76    83    90   NaN    49    26    33   NaN
     
        23     5    82    89    91    48    30    32    39    66
     
        79     6    13    95   NaN    29    31   NaN    45    72
     
        10    12    94   NaN    78    35    37    44   NaN    53
     
        11    18   100   NaN    84   NaN    43   NaN    27    59
    matrice résultat aprés le code
    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
    41.0000   41.8889   23.2222    6.7778       NaN       NaN       NaN   39.8889   34.5556   22.5556
     
       50.4444   61.1111       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN
     
       48.3333   61.0000       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN
     
       48.4444   63.1111       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN
     
       43.5556   56.8889   47.7778   36.4444       NaN       NaN       NaN       NaN       NaN       NaN
     
       27.5556   47.8889   53.2222   60.7778       NaN       NaN       NaN   44.8889       NaN       NaN
     
       17.1111   36.1111   52.5556       NaN       NaN       NaN       NaN       NaN       NaN       NaN
     
       15.0000   36.0000       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN
     
       15.1111   38.1111       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN
     
        5.6667   27.2222       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN

    code utilisé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    F3=ones(3)/9
     
    R3=imfilter(M,F3)
    merci pour l'aide

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 309
    Points : 52 901
    Points
    52 901
    Par défaut
    Essaie ceci :

    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
    M = [92    99     1     8    15   NaN    74    51    58    40
        98    80     7    14    16    73    55    57    64    41
         4    81    88   NaN    22    54    56    63   NaN    47
        85    87    19    21     3    60   NaN    69    71    28
        86    93    25     2     9    61    68    75    52    34
        17    24    76    83    90   NaN    49    26    33   NaN
        23     5    82    89    91    48    30    32    39    66
        79     6    13    95   NaN    29    31   NaN    45    72
        10    12    94   NaN    78    35    37    44   NaN    53
        11    18   100   NaN    84   NaN    43   NaN    27    59];
     
    idx = isnan(M);
     
    M(idx) = 0;
     
    F3 = ones(3)/9
     
    R3 = imfilter(M,F3);
     
    R3(idx) = nan

  3. #3
    Débutant
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 193
    Points : 58
    Points
    58
    Par défaut
    merci pour la réponse DUT

    c pratiquement ça

    dans ton code tu remplaces les NaN par la valeur 0, j'avais pensé à le faire mais en fait ça modifie le résultat

    pour un masque 3*3, la moyenne s'effectue en divisant par 9

    ce que je voudrais c'est si mon masque rencontre une valeur NaN ou deux...ect, la moyenne s'effectue en comptant que les valeurs reelles, si un NaN division par 8, si deux NaN division par 7...afin de ne pas modifier la valeur du pixel central...et si la valeur du pixel central est NaN, elle reste NaN

    c'est assez compliqué il doit falloir faire une boucle if ou quelque chose comme ça

    merci pour l'aide

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 309
    Points : 52 901
    Points
    52 901
    Par défaut
    En supposant qu'il n'y a aucune valeur nulle dans la matrice M de départ :

    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
    M = [92    99     1     8    15   NaN    74    51    58    40
        98    80     7    14    16    73    55    57    64    41
         4    81    88   NaN    22    54    56    63   NaN    47
        85    87    19    21     3    60   NaN    69    71    28
        86    93    25     2     9    61    68    75    52    34
        17    24    76    83    90   NaN    49    26    33   NaN
        23     5    82    89    91    48    30    32    39    66
        79     6    13    95   NaN    29    31   NaN    45    72
        10    12    94   NaN    78    35    37    44   NaN    53
        11    18   100   NaN    84   NaN    43   NaN    27    59]
     
    idx = isnan(M);
     
    MM = zeros(size(M,1)+2,size(M,2)+2);
    MM(2:end-1,2:end-1) = M;
     
    fun = @(x) mean(x(~isnan(x)&x>0));
     
    X = M;
     
    for r = 2:size(MM,1)-1
        for c = 2:size(MM,2)-1
            X(r-1,c-1) = fun(MM(r-1:r+1,c-1:c+1));
        end
    end
     
    X(idx) = nan

  5. #5
    Débutant
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 193
    Points : 58
    Points
    58
    Par défaut
    ça marche c nickel

    je comprends pas trop le code par contre

    je dois faire des filtres 5*5 et 7*7 aussi, je dois changer dans le code???

    sachant que ma matrice qui est à moyenner est plus importante que l'exemple et il n'y a pas de zéro


    merci beaucoup

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 309
    Points : 52 901
    Points
    52 901
    Par défaut
    C'est une simple convolution ...

  7. #7
    Membre éprouvé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2007
    Messages
    979
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 979
    Points : 1 256
    Points
    1 256
    Par défaut
    Salut,

    Dans le même style que le code de Dut :

    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
     
    % Test Image Data
    Im = [ 92    99     1     8    15   NaN    74    51    58    40
        98    80     7    14    16    73    55    57    64    41
         4    81    88   NaN    22    54    56    63   NaN    47
        85    87    19    21     3    60   NaN    69    71    28
        86    93    25     2     9    61    68    75    52    34
        17    24    76    83    90   NaN    49    26    33   NaN
        23     5    82    89    91    48    30    32    39    66
        79     6    13    95   NaN    29    31   NaN    45    72
        10    12    94   NaN    78    35    37    44   NaN    53
        11    18   100   NaN    84   NaN    43   NaN    27    59 ] 
     
    % Filter Size
    sF= 3; 
    msF = floor(sF/2); % Marge 
     
    % Filtred Image
    FIm = Im;
     
    for ii = msF+1:size(Im,1)-msF
        for jj = msF+1:size(Im,2)-msF
            subIm = Im(ii-msF:ii+msF,jj-msF:jj+msF); 
            FIm(ii,jj) = mean(subIm(~isnan(subIm)));       
        end
    end
     
    imagesc(Im)
    figure(2)
    imagesc(FIm)
    ++

  8. #8
    Débutant
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 193
    Points : 58
    Points
    58
    Par défaut
    simple pour vous par pour moi par contre....

    j'ai regardé le code ligne par ligne, je crois savoir où changer les paramètres,
    est ce que je remplace les 2 par des 4 ou 6 suivant le filtre 5*5 ou 7*7???

    je saisis par la ligne fun

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fun = @(x) mean(x(~isnan(x)&x>0))
    merci pour les renseignements

  9. #9
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 309
    Points : 52 901
    Points
    52 901
    Par défaut
    Citation Envoyé par niepoc Voir le message
    simple pour vous par pour moi par contre....
    Je n'ai pas dis que le code était simple mais qu'il réalisait une simple convolution.
    Maintenant si ce terme ne te dit rien, je t'invite à faire rapidement quelque recherche sur ce sujet...


    Citation Envoyé par niepoc Voir le message
    je saisis par la ligne fun

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fun = @(x) mean(x(~isnan(x)&x>0))
    Le code de mr_samurai te permettra de comprendre cette ligne

  10. #10
    Débutant
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 193
    Points : 58
    Points
    58
    Par défaut
    merci à tous les deux pour votre aide

    je commence à saisir les deux codes

    merci beaucoup et bonne journée à tous les deux

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

Discussions similaires

  1. [image] Générer une image avec des pixels non rectangulaires
    Par Jerome Briot dans le forum Téléchargez
    Réponses: 12
    Dernier message: 31/10/2014, 12h43
  2. Réponses: 2
    Dernier message: 10/10/2008, 00h37
  3. Filtrer une requête avec des checkbox
    Par prizmose dans le forum Requêtes
    Réponses: 0
    Dernier message: 28/05/2008, 10h31
  4. [HTML] Ouvrir une image avec des dimentions précises
    Par malabarbe dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 06/05/2008, 15h53
  5. rollover dans une image avec des zones cliquables
    Par brasco06 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 23/02/2006, 11h15

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