corrige2 .pdf



Nom original: corrige2.pdf

Ce document au format PDF 1.2 a été généré par / GNU Ghostscript 5.10, et a été envoyé sur fichier-pdf.fr le 11/11/2013 à 20:56, depuis l'adresse IP 41.102.x.x. La présente page de téléchargement du fichier a été vue 3239 fois.
Taille du document: 1.8 Mo (9 pages).
Confidentialité: fichier public




Télécharger le fichier (PDF)










Aperçu du document


Cours de traitement d’images
Corrig´e d’exercices
2. Acquisition, restitution et binarisation des images
30.11.1999
1. Post traitement d’un processus d’acquisition :
Dans certains cas, on souhaite num´eriser le contenu d’un livre en imposant un minimum de contraintes
a` l’ouvrage de fac¸on a` ne pas l’abimer. Il en r´esulte que l’image acquise est affect´ee d’une d´eformation
g´eom´etrique que l’on cherche a` corriger num´eriquement. L’image pieraph a` e´ t´e num´eris´ee dans le
conditions de la figure 1. Identifiez la d´eformation g´eom´etrique affectant celle-ci et e´ crivez un programme

.
permettant de la corriger dans le cas particulier o`u le param`etre est fix´e a`

Matrice CCD

α

Figure 1: Dispositif d’acquisition de l’image pieraph.

Comme le sugg`ere le sch´ema, nous commenc¸ons par n´egliger la (possible) d´eformation verticale. Si on
note la distance d’un pixel donn´e au centre de l’image et la distance effective qu’on aurait obtenu lors

d’une num´erisation ”`a plat” (
), la d´eformation affectant l’image r´esulte en un e´ crasement :






Pour approximer l’image id´eale, il faut donc sur-´echantilloner et interpoler les pixels manquants. Dans le cas

particulier o`u
, la dimension horizontale de l’image doit simplement eˆ tre doubl´ee. Le programme
suivant impl´emente cette technique en interpolant lin´eairement entre pixels au moyen d’un filtrage passebas. Les r´esultats sont pr´esent´es a` la figure 2.

1

function out = scanner(in)
%
% Correction de la deformation geometrique apres acquisition
%
% Usage : out = scanner(in)
[long,larg]
nlarg
out
filt

=
=
=
=

size(in);
2*larg -1;
zeros(long,nlarg); % image de sortie aux bonnes dimensions
[0.5 0.5];
% filtre passe-bas pour l’interpolation

%% Calculs des points intermediaires de l’image interpolee
for k=1:long
in_filt(k,:) = conv(in(k,:),filt);
end
in_filt = in_filt(1:long,2:larg); % suppression des points ajoutes par conv
%% Arrangement des valeurs dans l’image de sortie
for k=1:long
out(k,1:2:nlarg)
= in(k,:);
% les pixels originaux d’abord
out(k,2:2:nlarg -1) = in_filt(k,:); % les pixels interpoles ensuite
end
Affichage des r´esultats :
>> imagesc(im2); colormap(gray);axis(’image’);axis(’off’)
>> figure
>> imagesc(out); colormap(gray);axis(’image’);axis(’off’)

Figure 2: Correction d’un d´efaut d’acquisition. Image originale (`a gauche) et image corrig´ee (`a droite).

2

2. Exemple d’imprimante graphique a` niveaux de gris :
Le but de cet exercice est de transformer les variations de teintes d’une image en variations de densit´e de
points. Pour ce faire, subdivisez l’image en blocs ind´ependants de taille pixels. Pour chaque bloc,

calculez la moyenne . Soit quatre entiers en progression arithm´etique , , , tels que
et
"!
# o`u # est la valeur maximale de la gamme dynamique. Appliquez alors l’algorithme suivant :

$ Si &% remplac¸ez les valeurs du bloc courant par le pattern ')(+* repr´esent´e plus bas.

$ Si !, &%- remplacez les valeurs du bloc courant par le pattern ')./* repr´esent´e plus bas.

$ Si !, &%- remplacez les valeurs du bloc courant par le pattern '10 * repr´esent´e plus bas.

$ Si 2!, &%- remplacez les valeurs du bloc courant par le pattern '1 3* repr´esent´e plus bas.

$ Si & remplacez les valeurs du bloc courant par le pattern ')45* repr´esent´e plus bas.


Appliquez a` l’image woman de taille 6 6 . Sans aucune assomption concernant l’image initiale,
comment choisir les seuils 7 ?
8

(a)

8

8

(b)

(c)

8

8

8

8

8

8

8

(d)

(e)

Figure 3: Densit´es de points associ´ees aux variations de teinte d’une image.

Le choix le plus simple des seuils 7 consiste a` les choisir uniform´ement r´epartis sur la gamme dynamique.
Le programme suivant impl´emente cette technique, dont le r´esultat est pr´esent´e dans la figure 4.
function in = EmulPrint(in)
%
% Transformation d’une image d’intensite en une image de densite de points
% Usage
: out = EmulPrint(in);
%
% ATTENTION : ne fonctionne que pour des images de dimension paire
%
%% Definition des blocs de densite
bloc1 = zeros(2,2);
bloc2 = [0 0;0 1];
bloc3 = [1 0;0 1];
bloc4 = [0 1;1 1];
bloc5 = ones(2,2);
%% Calcul des seuils
m = min(min(in));
M = max(max(in));
step = (M-m)/5;
T = m+step:step:M-step;
[lins,cols] = size(in);

3

Figure 4: Transformation d’une image d’intensit´e en densit´e de points.

nblins = lins/2;
nbcols = cols/2;
for i=0:nblins-1
for j=0:nbcols-1
current_block = in(1+j*2:2+j*2,1+i*2:2+i*2);
mu
= mean(mean(current_block));
if (mu <= T(1))
in(1+j*2:2+j*2,1+i*2:2+i*2) = bloc1;
elseif (mu <= T(2))
in(1+j*2:2+j*2,1+i*2:2+i*2) = bloc2;
elseif (mu <= T(3))
in(1+j*2:2+j*2,1+i*2:2+i*2) = bloc3;
elseif (mu <= T(4))
in(1+j*2:2+j*2,1+i*2:2+i*2) = bloc4;
else
in(1+j*2:2+j*2,1+i*2:2+i*2) = bloc5;
end
end
end
3. M´ethodes de binarisation :
(a) Quamtification a` deux niveaux
Impl´ementez la m´ethode de binarisation bas´ee sur le seuillage brut de l’image : tous les pixels
d’intensit´e inf´erieure ou e´ gale a` la moiti´e de la gamme dynamique sont mis a` 0 et les autres a` 255.
Appliquez aux images lena.tif et cmpnd.tif.
(b) M´ethode du seuil al´eatoire
Faites le mˆeme exercice en ajoutant au pr´ealable un bruit uniforme a` l’image (utilisez la fonction
unidrnd).
(c) Binarisation avec seuil ordonn´e
On utilisera pour les matrices suivantes

9 :3; =<>@A?

CED

4

6B

GH

F

D
<J

J

BKA?

J

93:+I

D
B
6

J

B D
>

J

J


D A

B C
6

6

A?
C

C



B

B

F

B

D



B


E

F
D

F

D G MM
M
D

M
B
MM

B BLB H
A

?6
LD D

D B
B



Trouver les valeurs de ( et . permettant de binariser une image a` 256 niveaux de gris. Cr´eer les deux
matrices de seuil et appliquer la m´ethode aux images lena et cmpnd.
Rappel : Les matrices de seuil sont d´efinies par la formule
N')O PRQ)* (3 S'TO PUQT* V,.
o`u ( et . d´ependent du nombre de couleurs de l’image a` binariser et
motif (par ex. : MAP(points dispers´es), MAG(points group´es)).

est une matrice servant de

(d) Binarisation par la m´ethode de diffusion de l’erreur
Il n’est pas demand´e de traiter sp´ecialement les bords de l’image, que l’on se contentera d’´eviter.
Rappel : Le principe de cette m´ethode est r´esum´e sur la figure 5 : chaque pixel de l’image est seuill´e.
On calcule alors l’erreur introduite par ce seuillage err '1WRPYX3* [Z]\ '1W^PTX3*`_ N' Z]\ '1W^PTX3*a* . En utilisant
le filtre de diffusion donn´e sur la figure 5, cette erreur est r´epartie sur 4 pixels voisins, selon les
proportions indiqu´ees. On passe ensuite aux pixels suivants, en proc´edant ligne par ligne.
out

+

Seuillage T

+
in

-

+
+
+
Filtre :
3

*

7

5

1
Filtre de
diffusion

Figure 5: Sch´ema de la m´ethode de diffusion de l’erreur
(e) Comparez les diff´erentes m´ethodes.

$ Si on d´ecide de choisir le niveau de seuil a` la moyenne de l’image, on proc`ede comme suit dans le
premier cas :
>>
>>
>>
>>

X=imread(’lena.tif’);
bin = zeros(size(X));
bin(X > mean(mean(X))) = 255;
imshow(bin);

Le r´esultat est pr´esent´e dans les figures 6 et 7 dans la partie gauche. On voit clairement que les faibles
variations de luminance sont perdues.
$ Une mani`ere de rem´edier a` ce probl`eme est d’ajouter un bruit blanc a` l’image originale avant de la
binariser :
>> bin = zeros(size(X));
>> noise = unidrnd(64,size(X))-32;%generation d’un bruit uniforme centre sur 0
>> bin((double(X)+noise) > mean(mean(double(X) + noise))) = 255;
>> imshow(bin);

5

Cette op´eration pr´eserve les faibles variations (visible dans le d´egrad´e de luminance en bas et a` droite)
mais l’adjonction de bruit donne lieu a` une d´egradation de la qualit´e visuelle de l’image.

Figure 6: Image originale (`a gauche), apr`es un seuillage binaire brut (au centre) et un seuillage al´eatoire (`a droite) pour
“lena.tif”.

Figure 7: Image originale (`a gauche), apr`es un seuillage binaire brut (au centre) et un seuillage al´eatoire (`a droite) pour
“cmpnd.tif”.

$ La binarisation par la m´ethode du seuil ordonn´e s’effectue grˆace a` la fonction seuilord (cf. cidessous). Le calcul de ( et . s’effectue de la fac¸on suivante : connaissant la valeur maximale et
minimale de l’image consid´er´ee (resp. # et b ). Soit #dc et bec les coefficients de B ayant la plus
grande (resp. la plus petite) valeur. On souhaite donc trouver ( et . tels que #fc
V
corresponde
B
a` # et becg_
corresponde a` b pour que la gamme dynamique de l’image d’´entree soit utilis´ee
sompl`etement. Le syst`eme d’´equations v´erifı´e par ( et . est donc le suivant :
B

#
')# c V *h("V .
B

b
'ib c _ *a("V,.
On en tire donc les valeurs de ( et . :

(

#j_&b
B
# c V

6

. b

La fonction seuilord est donc la suivante :
% X est l’image d’entree
% D est la matrice utilisee pour le seuillage
% NB: D doit etre carree
function Y=seuilord2(X,D)
[h,w]=size(X);
n=length(D);%matrice carree
% generation d’une image contenant un nombre entier de blocs
h1=ceil(h/n)*n;
w1=ceil(w/n)*n;
B=zeros(h1,w1);
B(1:h,1:w)=X;
% extraction des extremas de l’image
% d’entree et de la matrice de seuillage
m=double(min(min(X)));
M=double(max(max(X)));
mD=min(min(D));
MD=max(max(D));
% calcul de a et b
a=(M-m)/(MD+1);
b=m;
% Calcul des seuils reels
MAT=a*D + b;
Y = B > repmat(MAT,ceil(w/n),ceil(h/n)); %seuillage
%---------------------------------------------------------L’utilisation de cette fonction se fait de la fac¸on suivante :
>>
>>
>>
>>

X=imread(’lena.tif’);
mat=[9 5 6;4 1 2;8 3 7]; %pour la matrice a points disperses
Y=seuilord(X,mat);
imwrite(Y(1:256,1:256),’lena_seuildis.tif’);

Les r´esultats obtenus sont pr´esent´es sans la figure 8 pour l’image lena.tif et dans la figure 9 pour
l’image cmpnd.tif.

7

Figure 8: Image originale (`a gauche), apr`es un seuillage a` points disper´es (au centre) et un seuillage a` points group´es (`a
droite).

Figure 9: Image originale (`a gauche), apr`es un seuillage a` points disper´es (au centre) et un seuillage a` points group´es (`a
droite).

$ La fonction qui effectue la binarisation par la m´ethode de diffusion de l’erreur est donn´ee ci-apr`es.
Dans cette impl´ementation particuli`ere, on demande que l’image d’entr´ee soit cod´ee sur 256 niveaux
` titre de simplification, les pixels se situant sur le bord de l’image ne sont pas
de gris (1 a` 256). A
seuill´es, et ne sont pas eˆ tre consid´er´es. Les r´esultats de cette m´ethode sur les deux images tests sont
donn´es sur la figure 10.
function out = diffusion (in)
T = 128; % Seuil
filtre = [0 0 7; 3 5 1]/16; % Filtre
black = 1; white = 256;
[rows, cols] = size(in);
out = in;
for i=(2:rows-1)
for j=(2:cols-1)
old = out(i,j); % Seuillage
if out(i,j) > T
out(i,j) = white;
else
out(i,j) = black;
end
diff = old - out(i,j);

8

% Diffusion de l’erreur
out (i:i+1, j-1:j+1) = out (i:i+1, j-1:j+1) + filtre * diff;
end
end

Figure 10: Images originales (en haut), et images binaris´ees par la m´ethode de diffusion de l’erreur (en bas).

$ La m´ethode de diffusion de l’erreur, bien que plus coˆuteuse en termes de temps de calcul est celle qui
donne les meilleurs r´esultats sur le plan visuel. La m´ethode du seuillage ordonn´e avec la matrice “`a
points dispers´es” donne des r´esultats satisfaisants, et meilleurs que ceux obtenus avec la matrice “`a
points group´es”. Le seuillage devient trop visible a` cause de ce groupement, mais sans doute aussi a`
cause de la taille de la matrice qui n’est plus n´egligeable par rapport a` celle de l’image. La m´ethode
de seuillage al´eatoire donne des r´esultats int´eressants sur les contours, mais induit trop de bruit dans
les parties uniformes.

9



Documents similaires


exercice2
corrige2
corrige4
seance4
exercice1
ak65s3m


Sur le même sujet..