Bonjour,
Sur cette image, j'aimerais enlever les points rouges mais je n'y arrive pas (je débute).
Est ce que vous auriez quelques piste ?
Bonjour,
Sur cette image, j'aimerais enlever les points rouges mais je n'y arrive pas (je débute).
Est ce que vous auriez quelques piste ?
Si ton image est de type RGB et si le rouge est pur (255,0,0) , il suffit de faire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 RGB = imread(...); idx = (RGB(:,:,1) = 255) & (RGB(:,:,2) = 0) & (RGB(:,:,3) = 0); RGB(:,:,1) = RGB(:,:,1).*~idx; imwrite(RGB,...);
Je ne sais pas si mes points sont pur rouge...
Quand je lance ton code :
Il me retourne une erreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 % Enlever les points rouges clear all; close all; clc; RGB = imread('albireo_bruit.bmp'); idx = (RGB(:,:,1) = 255) & (RGB(:,:,2) = 0) & (RGB(:,:,3) = 0); RGB(:,:,1) = RGB(:,:,1).*~idx;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ??? Error: File: albireo_bruit.m Line: 7 Column: 19 The expression to the left of the equals sign is not a valid target for an assignment.
Je suis allé un peu vite (et surtout je n'ai pas testé le code)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 RGB = imread('albireo_bruit.bmp','bmp'); idx = (RGB(:,:,1) == 255) & (RGB(:,:,2) == 0) & (RGB(:,:,3) == 0); idx = cast(~idx,class(RGB)); RGB(:,:,1) = RGB(:,:,1).*idx;
Merci ca fonctionne parfaitement.
Mais est ce que tu pourrais m'expliquer ce que font les lignes de codes ?
Ton image est de type RGB. C'est à dire que la couleur de chaque pixel est codée avec 3 valeurs (R: red ; G : green ; B : blue)
Lors de la lecture de l'image, les données sont donc stockées dans une matrices MxNx3 où chaque couche représente une des 3 couleurs RGB.
Le codage de la couleur rouge dans le système RGB est (255,0,0).
Donc pour trouver les pixels rouges de l'image il faut faire :
La variable idx stocke les indices logiques (voir la : Qu'est-ce que l'indexage logique ?)
Code : Sélectionner tout - Visualiser dans une fenêtre à part idx = (RGB(:,:,1) == 255) & (RGB(:,:,2) == 0) & (RGB(:,:,3) == 0);
Une fois que les pixels rouges sont localisés (avec l'indexage logique), et comme tu souhaites les colorer en noir avec pour valeur RGB (0,0,0), il suffit de mettre la valeur 255 de la couche R à 0 pour chacun de ces pixels : (255,0,0) => (0,0,0)
Ce qui se fait en multipliant les valeurs de la première composante R de l'image (ici R(:,:,1)) par le masque binaire tiré de idx
Pour chaque valeur, si idx vaut 1 (le pixel est bien rouge) alors la valeur équivalente de R doit être mise à 0, sinon la valeur garde sa valeur initiale.
Ce qui s'écrit en MATLAB :
L'utilisation de CAST permet juste de s'affranchir du problème de multiplication entre classes différentes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part RGB(:,:,1) = RGB(:,:,1).*~idx;
Merci Dut, c'est tout ta fait clair :-)
Sinon j'ai d'autres problèmes a résoudre :
Pour cette images :
Je dois isoler les étoiles brillante. Est ce que tu connais une solution qui conviendrait mieux à celle que j'ai trouvé ?
---
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 % Isoler les étoiles les plus brillante clear all; close all; clc; img = imread('pleiades_i.jpg'); imshow(img) img = rgb2gray(img); img = im2bw(img,graythresh(img)); [img,n] = bwlabeln(img); stats =regionprops(img,'Area'); idx = find([stats.Area] > 80); BW2 = ismember(img,idx); figure, imshow(BW2)
Et pour cette image :
Je dois filtrer le bruit, j'ai fait avec cette manière mais est ce que c'est bien réalisé ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 clear all; close all; clc; img =imread('CAMERAMAN_BRUIT.tif'); imshow(img); h=ones(3,3); h(2,2)=0; h=h/8; imgfilt = imfilter(img,h); figure, imshow(imgfilt);
Vous appliquez ici un filtre linéaire moyennant, cependant le filtre que vous avez crée ne prend pas en considération la valeur du pixel central. Dans ce cas la nouvelle valeur d'un pixel vaut la moyenne de ses voisins.
Mais de manière générale,le filtre moyennant effectue la moyenne de tous les pixels (pixel central y compris) :
D'autre part, je pense que Matlab permet de générer des filtres prédéfinis. (fonction "fspecial" si je ne me trompe pas)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 h=ones(3,3); h=h/9;
Ah oui tiens, je ne connaissait pas fspecial ... j'ai testé et effectivement c'est plus propre comme ca.
Effectivement c'était une erreur. Enfaite j'avais mis le pixel central a 0 et donc /8 (j'avais lu cela quelque part) et je voulais voir la différence mais ca n'a pas changé grand chose. (d'ou le /8 qui est resté !)
Pour l'autre images (les étoiles) tu n'as pas d'idées ?
Ben je parle du filtre que vous avez utilisé pour la seconde image :
C'est la matrice "h" qui définit le filtre."h" peut être un masque moyannant (c'est ce que vous avez fait) ou bien un masque de Gauss, ce qui permet aussi de réduire le bruit.Se sont tous des filtres linéaires du faite que le résultat est une convolution de l'image originale avec le masque.Comme vous avez pu le constater ces filtres génère du flou dans l'image (contour en dégradé).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 img =imread('CAMERAMAN_BRUIT.tif'); imshow(img); h=ones(3,3); h=h/9; imgfilt = imfilter(img,h); figure, imshow(imgfilt);
Sinon y a aussi les filtres non linéaire. Par exemple le filtre "Median",qui permet de réduire le bruit,sans trop flouter l'image. ( => Matlab median filter)
Ah oui d'accord :-) je vois très bien.
J'ai essayé mais ca ne change rien, les petite étoiles sont toujours là.
As-tu essayé en effectuant des ouvertures et fermetures morphologiques à niveau de gris !!!
en prenant un élément structurant circulaire dont le rayon est supérieur à la taille des étoiles que tu souhaites éliminer...
Code : Sélectionner tout - Visualiser dans une fenêtre à part imopen imclose
A partir de là, tu obtiens une image que tu peux seuiller afin de ne conserver que les centres des images très brillantes et effectuer un reconstruction par marqueurs.
C'est à peu près l'idée que je propose. Maintenant, à toi de consulter l'aide de Matlab, ces fonctions sont assez basiques, et fortement documéntées.
Bon courage et bonne année à tous
bonjour: )
SVP pouvez vous m'aidez?
Mon problème est de détecter une forme géométriques dans une image.
J'ai pu détecter toutes les formes présents dans l'image, mais une forme bien déterminer comme par exemple une cercle, j'ai essayé mais malheureusement j'ai pas pu résoudre le problèle.
SVP c'est urgent j'ai passé deux semaines sans avoir la bonne solution
merci
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager