Aller au contenu

Fichier:Detection cercle image fortement bruitee.png

Le contenu de la page n’est pas pris en charge dans d’autres langues.
Une page de Wikipédia, l'encyclopédie libre.

Detection_cercle_image_fortement_bruitee.png(366 × 365 pixels, taille du fichier : 24 kio, type MIME : image/png)

Ce fichier et sa description proviennent de Wikimedia Commons.

Description

Description
English: Detection of a circle in a very noisy picture.

The picture is a fuzzy circle: the intensity is a gaussian function of the difference between the distance to the center C(2;2) and the radius r = 2 of the nominal circle. A random background is added. The intensity ranges from 6 to 172, for a 256-level grey scale.

The points that exceed a given intensity (threshold = 140) are extracted and represented as green crosses. The circle fitting is performed on these points. We use the Kåsa and Coope linear method (method of the algebraic distance).
Français : Détection d'un cercle dans une image très bruitée.

L'image est un cercle flou : l'intensité est une fonction gaussienne de la différence entre la distance au centre C(2 ; 2) et le rayon r = 2 du cercle nominal. Nous ajoutons un fond bruité. L'intensité va de 6 à 172, pour une échelle de gris à 256 niveaux.

Nous extrayons les points qui dépassent une intensité donnée (seuil = 140) ; ils sont représentés par des croix vertes. Nous effectuons une régression circulaire sur ces points. Nous utilisons la méthode linéaire de Kåsa et Coope (méthode de la distance algébrique).
Date
Source Travail personnel
Auteur Cdang

Scilab source

English: English version by default.
Français : Version française, si les préférences de votre compte sont réglées (voir Special:Preferences).

Programme de création de l'image. Ce programme génère trois fichiers :

  • X_cercle_bruite.txt : échelle des x ;
  • Y_cercle_bruite.txt : échelle des y ;
  • image_cercle_bruite.txt : liste des intensités.

On peut jouer sur :

  • le caractère plus ou moins flou du cercle : variable sigmaflou ;
  • le caractère plus ou moins bruité du fond : variable varfond ;
  • le rapport signal/bruit (contraste) : variables intensite et moyfond.
// **********
// Initialisation
// **********

clear;
clf;
chdir('monchemin/');

// **********
// Constantes
// **********

// image
xmin = -1;
xmax = 5;
ymin = -1;
ymax = 5;
pas=0.1;

// cercle
centre = [2;2]; // centre du cercle
rayon = 2; // rayon du cercle
sigmaflou = 1; // variance du flou gaussien (largeur)
intensite = 128; // 256 niveau de gris (0-255)

// fond, 256 niveau de gris (0-255)
varfond = 20; // variance du bruit de fond
moyfond = 64; // moyenne du fond

// **********
// Fonctions
// **********

function [y] = gauss(x, esperance, ecart_type)
    y = 1/(ecart_type*sqrt(2*%pi))*exp(-((x - esperance)/ecart_type)^2/2);
endfunction

// **********
// Programme principal
// **********

// coordonnées
X = (xmin:pas:xmax)';
Y = (ymin:pas:ymax)';
tailleX = size(X, '*');
tailleY = size(Y, '*');

// fond d'image
base = ones(tailleX, tailleY);
fond = moyfond*base + varfond*rand(base, 'normal')

// tracé du cercle
cercle = zeros(base);
for i = 1:tailleX
    for j = 1:tailleY
        dist_centre = sqrt((X(i)-centre(1))^2 + (Y(j)-centre(2))^2);
        cercle(i,j) = intensite*gauss(dist_centre, rayon, sigmaflou);
    end
end

// image globale
image = floor(cercle + fond);

// Affichage
isoview(xmin, xmax, ymin, ymax)
cmap = graycolormap(256);
xset('colormap', cmap);
grayplot(X, Y, image);

// enregistrement
write('X_cercle_bruite.txt', X, '(F4.1)');
write('Y_cercle_bruite.txt', Y, '(F4.1)');
write('image_cercle_bruite.txt', image, '(I3)');

Programme traitant les données.

On peut jouer sur :

  • le seuil de détection : variable seuil.
// **********
// Initialisation
// **********

clear;
clf;
chdir('monchemin/')

// **********
// Constantes
// **********

seuil = 140; // seuil de détection sur 256 niveaux de gris

// **********
// fonctions
// **********

// Recomposition de la matrice image
function [matrice]=matrice_image(tailleX, tailleY, vecteur)
    // tailleX, tailleY : dimensions de l'image en nb de pts (entiers)
    // vecteur : liste des intensités (tailleX*tailleY)
    // matrice : intensités sous forme de matrice tailleX x tailleY
    for i = 1:tailleX
        for j = 1:tailleY
            matrice(i,j) = vecteur((i - 1)*tailleX + j);
        end
    end
endfunction

// Détection de seuil
function [X, Y] = detection(Ximage, Yimage, intensite, seuil)
    // Ximage, Yimage : échelles (vecteurs)
    // intensité : niveaux de gris (matrice)
    // seuil : seuil de détection (scalaire)
    // X, Y : coordonnées des points dont l'intensité dépasse le seuil
    // (vecteurs)
    tailleX = size(Ximage,'*');
    tailleY = size(Yimage,'*');
    k = 1;
    for i = 1:tailleX
        for j = 1:tailleY
            if (intensite(i,j) > = seuil) then
                X(1,k) = Ximage(i);
                Y(1,k) = Yimage(j);
                k = k+1;
            end
        end
    end
endfunction

// changement de variable initial

function [d]=chgtvar(A)
    // A : matrice m*n
    // n : nb de points ; m : dimension de l'espace (2 dans le plan)
    // chaque colonne contient les coordonées des points exp
    // d : matrice n*1
    [m, n] = size(A);
    for i = 1:n
        d(i, 1) = norm(A(:,i)).^2;
    end
endfunction

// régression circulaire linéaire

function [C, r, R]=regression_circulaire(X, Y)
    // X, Y : points expérimentaux (vecteurs ligne)
    // C : coordonnées du centre du cercle (vecteur)
    // r : rayon du cercle (scalaire)
    A = [X ; Y];
    d = chgtvar(A);
    // xetoile = 2*xcentre
    // yetoile = 2*ycentre
    // zetoile = r^2 - (xcentre^2 + ycentre^2)
    [xyetoile, zetoile, sigma] = reglin(A, d');
    C = 0.5*xyetoile;
    r = sqrt(zetoile + C(1)^2 + C(2)^2);
    R = sigma;
endfunction

// **********
// programme principal
// **********

// lecture des données

image_brute = read('image_cercle_bruite.txt', -1, 1); // intensité
Xdef = read('X_cercle_bruite.txt', -1, 1);
Ydef = read('Y_cercle_bruite.txt', -1, 1);
xmin = min(Xdef); xmax = max(Xdef);
ymin = min(Ydef); ymax = max(Ydef);
tailleX = size(Xdef, '*');
tailleY = size(Ydef, '*');

// mise en matrice des intensités
image = matrice_image(tailleX, tailleY, image_brute);

// Affichage de l'image bruitée
isoview(xmin, xmax, ymin, ymax);
cmap = [graycolormap(256);
    0, 255, 0; // vert
    225, 0, 0]; // rouge
xset('colormap', cmap);
grayplot(Xdef, Ydef, image);

// détection des pixels dépassant le seuil
[Xcercle, Ycercle] = detection(Xdef, Ydef, image, seuil);
plot(Xcercle, Ycercle, 'g+');

// regression
[centre, rayon, ecart] = regression_circulaire(Xcercle, Ycercle);

// écriture

texte = 'C('+string(centre(1))+' ; '+string(centre(2))+') ;...
    r = '+string(rayon);

// fond blanc (4x le même texte décalé)
xstring(-0.48, 4.5, texte);
txt = gce(); txt.font_foreground = 256; // couleur blanc (cmap)
xstring(-0.52, 4.5, texte);
txt = gce(); txt.font_foreground = 256;
xstring(-0.5, 4.52, texte);
txt = gce(); txt.font_foreground = 256;
xstring(-0.5, 4.48, texte);
txt = gce(); txt.font_foreground = 256;

xstring(-0.5, 4.5, texte);
txt = gce(); txt2.font_foreground = 1; // couleur noir (cmap)

// tracé du modèle

plot(centre(1), centre(2), 'r+')
diametre = 2*rayon;
xarc(centre(1) - rayon, centre(2) + rayon,...
    diametre, diametre,...
    0, 360*64)
b = gce(); // cercle
b.foreground = 258; // couleur rouge (cmap)

// Affichage des paramètres

print(%io(2), centre)
print(%io(2), rayon)
print(%io(2), ecart)

Conditions d’utilisation

Moi, en tant que détenteur des droits d’auteur sur cette œuvre, je la publie sous les licences suivantes :
GNU head Vous avez la permission de copier, distribuer et modifier ce document selon les termes de la GNU Free Documentation License version 1.2 ou toute version ultérieure publiée par la Free Software Foundation, sans sections inaltérables, sans texte de première page de couverture et sans texte de dernière page de couverture. Un exemplaire de la licence est inclus dans la section intitulée GNU Free Documentation License.
w:fr:Creative Commons
paternité partage à l’identique
Ce fichier est sous licence Creative Commons Attribution – Partage dans les Mêmes Conditions 3.0 (non transposée), 2.5 Générique, 2.0 Générique et 1.0 Générique.
Vous êtes libre :
  • de partager – de copier, distribuer et transmettre cette œuvre
  • d’adapter – de modifier cette œuvre
Sous les conditions suivantes :
  • paternité – Vous devez donner les informations appropriées concernant l'auteur, fournir un lien vers la licence et indiquer si des modifications ont été faites. Vous pouvez faire cela par tout moyen raisonnable, mais en aucune façon suggérant que l’auteur vous soutient ou approuve l’utilisation que vous en faites.
  • partage à l’identique – Si vous modifiez, transformez, ou vous basez sur cette œuvre, vous devez distribuer votre contribution sous la même licence ou une licence compatible avec celle de l’original.
Vous pouvez choisir l’une de ces licences.

Légendes

Ajoutez en une ligne la description de ce que représente ce fichier

Éléments décrits dans ce fichier

dépeint

Historique du fichier

Cliquer sur une date et heure pour voir le fichier tel qu'il était à ce moment-là.

Date et heureVignetteDimensionsUtilisateurCommentaire
actuel10 décembre 2012 à 16:12Vignette pour la version du 10 décembre 2012 à 16:12366 × 365 (24 kio)Cdang{{Information |Description ={{en|1=margins removed}} |Source ={{own}} |Author =Cdang |Date = |Permission = |other_versions = }}
10 décembre 2012 à 14:50Vignette pour la version du 10 décembre 2012 à 14:50610 × 460 (18 kio)Cdang{{Information |Description ={{en|1=Detection of a circle in a very noisy picture. The picture is a fuzzy circle: the intensity is a gaussian function of the difference between the distance to the center C(2;2) and the radius ''r'' = 2 of the nomina...

La page suivante utilise ce fichier :

Métadonnées