Précédent   Forum des professionnels en informatique > Environnements de développement > MATLAB > Images
Images Forum d'entraide sur le traitement d'images en MATLAB
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/02/2012, 16h00   #1
Membre du Club
 
Inscription : janvier 2012
Messages : 190
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 190
Points : 47
Points : 47
Par défaut Bruiter une image puis débruiter avec méthode des 5 points

Bonjour,

Je cherche à réaliser bruitage une image puis le débruitage avec la méthode des 5 points.
J'ai fais un bout de code jusqu'à mnt:

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
function u = question1(Im)
k1 = 15; 
Im = double(Im) ;
for i=1:3
    B=Im(:,:,i); 
    B=double(B); 
    noise = randn(size(B)); 
    B=B+k1*noise; 
    Im_Noisy(:,:,i) = uint8(B); 
end
figure, imshow(Im_Noisy); title('Image bruitée'); 
dt=0.2;
T=1;
for i=1:3
    u=double(Im_Noisy(:,:,i)); 
    [n m] = size(u); 
    for t = 0:dt:T
        u_xx = u(:, [2:n n]) - 2*u + u(:, [1 1:n-1]); 
        u_yy = u(:, [2:m m]) - 2*u + u(:, [1 1:m-1]); 
        u = u + dt*(u_xx + u_yy); 
    end
    Im_denoised(:,:,i) = int8(u); 
end
figure, imagesc(Im_denoised); title ('Image liséée'); 
end

Mais lorsque je cherche à utiliser ma fonction dans la console, j'ai cette erreur:

Code :
1
2
3
4
5
>> question1(Im)
??? Index exceeds matrix dimensions.

Error in ==> question1 at 5
    B=Im(:,:,i);
Pourriez-vous e filer un coup de main svp?
bilou_12 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2012, 16h05   #2
Modérateur
 
Avatar de Winjerome
 
Homme Jérôme
Inscription : septembre 2009
Messages : 3 598
Détails du profil
Informations personnelles :
Nom : Homme Jérôme
Âge : 24
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : septembre 2009
Messages : 3 598
Points : 6 824
Points : 6 824
Bonjour,

>> Index exceeds matrix dimensions.

Est-tu sûr que ton image est un image couleur? Et non en niveaux de gris?
Que retourne size(Im)?

Remarque: étant donné la ligne Im = double(Im) ; la ligne B=double(B); est inutile.
__________________
Débutant en MATLAB? Vous voulez faire une Interface Graphique? Les Tutoriels et la FAQ sont là pour vous aider
Une erreur? FAQ : Messages d'erreur et avertissements
"Ça ne marche pas" n'est pas une réponse acceptable Expliquez clairement votre problème (erreurs, résultats non attendus...).
Citation:
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
Je suis régulièrement sur le chat DVP - Pas de question technique par MP, Merci
Winjerome est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2012, 16h07   #3
Membre confirmé
 
Homme Thomas Pegot
Étudiant
Inscription : janvier 2012
Messages : 195
Détails du profil
Informations personnelles :
Nom : Homme Thomas Pegot
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2012
Messages : 195
Points : 299
Points : 299
Bonjour,

Tu met quoi dans ta variable Im? Est-ce que tu peux nous retourner size(Im) dans ta fonction.
Gakusei est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2012, 16h14   #4
Membre du Club
 
Inscription : janvier 2012
Messages : 190
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 190
Points : 47
Points : 47
Dans la variable Im, je mets une photo noir et blanc. Pas couleur...

Voila ce que je rentre dans la console.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>> Im = ('Tennis.tif');
 
>> imshow(Im)
>> question1(Im)
??? Index exceeds matrix dimensions.

Error in ==> question1 at 5
    B=Im(:,:,i);
 
>> size(Im)

ans =

     1    16
Ca réponds à vos questions?
bilou_12 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2012, 16h17   #5
Modérateur
 
Avatar de Winjerome
 
Homme Jérôme
Inscription : septembre 2009
Messages : 3 598
Détails du profil
Informations personnelles :
Nom : Homme Jérôme
Âge : 24
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : septembre 2009
Messages : 3 598
Points : 6 824
Points : 6 824
Citation:
Envoyé par bilou_12 Voir le message
Code :
1
2
3
4
5
6
>> size(Im)

ans =

     1    16
Là ce n'est même pas un tableau 2D que tu rentres, mais un vecteur ligne
Et donc en demandant 3 dimensions à un vecteur:
Ça coince.
Il te manque peut-être un appel à IMREAD, non?
Code :
Im = imread('Tennis.tif');
__________________
Débutant en MATLAB? Vous voulez faire une Interface Graphique? Les Tutoriels et la FAQ sont là pour vous aider
Une erreur? FAQ : Messages d'erreur et avertissements
"Ça ne marche pas" n'est pas une réponse acceptable Expliquez clairement votre problème (erreurs, résultats non attendus...).
Citation:
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
Je suis régulièrement sur le chat DVP - Pas de question technique par MP, Merci
Winjerome est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2012, 16h24   #6
Membre du Club
 
Inscription : janvier 2012
Messages : 190
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 190
Points : 47
Points : 47
Ca marche toujours pas avec le imread...
La size de l'image reste un vecteur 2D.

Voila ce que j'ai reécris:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
>> Im=imread('Tennis.tif'); 
>> size(Im)

ans =

   512   512

>> question1(Im)
??? Index exceeds matrix dimensions.

Error in ==> question1 at 5
    B=Im(:,:,i);
 
>>
Est-ce que j'ai bien compris ce que tu suggérais?
bilou_12 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2012, 16h37   #7
Modérateur
 
Avatar de Winjerome
 
Homme Jérôme
Inscription : septembre 2009
Messages : 3 598
Détails du profil
Informations personnelles :
Nom : Homme Jérôme
Âge : 24
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : septembre 2009
Messages : 3 598
Points : 6 824
Points : 6 824
Oui tu as bien compris
Mais toi tu ne sembles pas comprendre que le code de ta fonction question1 semble être fait pour une image couleur (donc MxNx3) et non en niveaux de gris (MxN) comme l'est ton image 'Tennis.tif'.
Donc à toi de le modifier en conséquence.
__________________
Débutant en MATLAB? Vous voulez faire une Interface Graphique? Les Tutoriels et la FAQ sont là pour vous aider
Une erreur? FAQ : Messages d'erreur et avertissements
"Ça ne marche pas" n'est pas une réponse acceptable Expliquez clairement votre problème (erreurs, résultats non attendus...).
Citation:
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
Je suis régulièrement sur le chat DVP - Pas de question technique par MP, Merci
Winjerome est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2012, 16h49   #8
Membre du Club
 
Inscription : janvier 2012
Messages : 190
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 190
Points : 47
Points : 47
D'accord!

Donc j'ai modifié le code

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
function u = question1(Im)
k1 = 15; 
Im = double(Im) ;

%pour bruiter
for i=1:3
    B=Im(:,i); 
    B=double(B); 
    noise = randn(size(B)); 
    B=B+k1*noise; 
    Im_Noisy(:,i) = uint8(B); 
end
figure, imshow(Im_Noisy); title('Image bruitée'); 

%pour débruiter suivant méth 5 pts
dt=0.2;
T=1;
u=double(Im_Noisy);
[n m] = size(u); 
for t = 0:dt:T
    u_xx = u(:, [2:n n]) - 2*u + u(:, [1 1:n-1]); 
    u_yy = u(:, [2:m m]) - 2*u + u(:, [1 1:m-1]); 
    u = u + dt*(u_xx + u_yy); 
end
figure, imagesc(u); colormap gray 
end
Mais maintenant, j'ai une image toute fine (un vecteur) qui s'affiche?!
bilou_12 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2012, 16h59   #9
Modérateur
 
Avatar de Winjerome
 
Homme Jérôme
Inscription : septembre 2009
Messages : 3 598
Détails du profil
Informations personnelles :
Nom : Homme Jérôme
Âge : 24
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : septembre 2009
Messages : 3 598
Points : 6 824
Points : 6 824
Avant dans ta première boucle for, on parcourait les 3 couleurs R, G B, mais dans ton nouveau code, tu parcours les 512 colonnes.

Ici (dans la logique de ton premier code) tu n'as pas besoin de cette boucle. Dans l'absolu, pour que cela fonctionne même avec des images couleurs, tu peux faire:
Code :
1
2
3
4
5
6
7
8
[m n rgb] = size(Im);
Im_Noisy = zeros(size(Im),'uint8'); % pre-allocation
for i=1:rgb
    B=Im(:,:,i); 
    noise = randn(size(B)); 
    B=B+k1*noise; 
    Im_Noisy(:,:,i) = uint8(B); 
end
__________________
Débutant en MATLAB? Vous voulez faire une Interface Graphique? Les Tutoriels et la FAQ sont là pour vous aider
Une erreur? FAQ : Messages d'erreur et avertissements
"Ça ne marche pas" n'est pas une réponse acceptable Expliquez clairement votre problème (erreurs, résultats non attendus...).
Citation:
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
Je suis régulièrement sur le chat DVP - Pas de question technique par MP, Merci
Winjerome est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2012, 17h00   #10
Membre confirmé
 
Homme Thomas Pegot
Étudiant
Inscription : janvier 2012
Messages : 195
Détails du profil
Informations personnelles :
Nom : Homme Thomas Pegot
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2012
Messages : 195
Points : 299
Points : 299
En fait il faut que tu enlève ta boucle for. En simplifiant un peu la partie bruitage:

Code :
1
2
3
4
5
6
7
8
function u = question1(Im)
k1 = 15; 
Im = double(Im) ;
%pour bruiter
noise = randn(size(Im)); 
B=Im+k1*noise; 
Im_Noisy = uint8(B); 
figure, imshow(Im_Noisy); title('Image bruitée');
Gakusei est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2012, 17h06   #11
Membre confirmé
 
Homme Thomas Pegot
Étudiant
Inscription : janvier 2012
Messages : 195
Détails du profil
Informations personnelles :
Nom : Homme Thomas Pegot
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2012
Messages : 195
Points : 299
Points : 299
A mon avis la boucle for est inutile si tu n'explicite pas les composantes de tes matrices dans ton script, les allocations se feront automatiquement lors des affectation. Car les calcul que tu effectues se font sur la matrice entière.
Gakusei est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2012, 17h08   #12
Membre du Club
 
Inscription : janvier 2012
Messages : 190
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 190
Points : 47
Points : 47
Super!!!

Ca marche parfaitement!!! J'obtiens d'abord l'image bruitée puis l'image débruitée avec la méthode des 5 pts!

Merci à tous les 2!
bilou_12 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h55.


 
 
 
 
Partenaires

Hébergement Web