TP d entraãőnement : reconnaissance de caractères O. Wilk avril 2010 1 Introduction Dans ce TP, nous allons développer une méthode permettant la reconnaissance de caractères. Nous nous limiterons à reconnaitre les chiffres de 0 à 9. La méthode proposée repr certains éléments présentés en ED. Elle se décompose en 2 parties. La première est une étape de préparation qui consiste à déterminer une image "référence" pour chaque type de chiffre. La seconde est l étape de reconnaissance qui consiste à déterminer une image dans l espace constitué par les images "références" qui soit la plus proche de l image contenant le chiffre "inconnu". 1
Cnam - Réf. 18458 - Traitement des images et géométrie - TP 2 2 La préparation 2.1 La base Pour cette étape, nous allons utiliser une base de données. Pour chaque type de chiffre, nous avons n images différentes. Pour le chiffre i, nous avons les images {X j i lrp Q /j = 1,n} (i peut prre les valeurs de 0 à 9). Remarque : Chaque image X j i doit être binarisée à l aide d une opération de seuillage. La valeur du fond doit être égale à 0, donc la valeur des pixels décrivant le chiffre vaut 1. Pour déterminer l image "référence" X R i pour chaque chiffre i, nous résolvons le problème suivant : min X R i J (1) avec J = 1 n P Q (Xi R (p,q) X j i 2 (p,q))2 (2) j=1 p=1 q=1 Les solutions Xi R (cf. Figure 1) de (1) pour chaque i de 0 à 9 constituent une base d images "chiffre" nous permettant d envisager la reconnaissance. Mais avant cela, il faut procéder à au moins une amélioration. Figure 1 : les images "références".
Cnam - Réf. 18458 - Traitement des images et géométrie - TP 3 2.2 Une amélioration Les images {X j i /j = 1,n} contiennent chacune un chiffre. Celui-ci peut être positionné de manière très différente au sein de ces images. Pour remédier à cela, nous effectuons un recentrage de la manière suivante : Pp=1 Q q=1 Mp = fix( Xj i p ) nb Pp=1 Q q=1 Mq = fix( Xj i q ) nb avec nb = P Q X j i p=1 q=1 (nombre de pixel de valeur 1). Remarque : Le fait d avoir le fond de l image à 0 et le chiffre à 1 est bien sur très important pour que la moyenne précédente est le sens que nous souhaitons. Y j i = X j i (Mp a : Mp + a,mq b : Mq b) Y j i est donc de dimension (2a + 1) (2b + 1). Remarque : Attention en fonction du choix de a et de b, il peut être utile de prolonger l image X j i pour que l opération précédente puisse s effectuer! Bien entu, cette amélioration doit s effectuer avant la détermination des images "références" ainsi que pour chaque image contenant un chiffre inconnu. 3 La reconnaissance La reconnaissance consiste à résoudre le problème suivant : min α J1 (3) avec J1 = 1 P Q 9 (X(p,q) α i Xi R (p,q)) 2 2 p=1 q=1 i=0 (4) X étant l image contenant le chiffre inconnu et α lr 10. La valeur de i, où α i (ième composante de la solution de (3)) est maximal, nous fournit un bon candidat pour être le chiffre recherché. 4 L application 4.1 La programmation Vous programmerez les étapes suivantes :
Cnam - Réf. 18458 - Traitement des images et géométrie - TP 4 - Lecture de l image BdD "Base De Données", vous retrouverez les X j i manière suivante : X j i = BdD(i P + 1 : (i + 1) P,j Q + 1 : (j + 1) Q) pour i = 0,9 et j = 1,n. de la - Binarisation : Si X j i (p,q) seuil alors Xj i (p,q) = 1 sinon Xj i (p,q) = 0. - Recentrage des chiffres : Pour accélérer ce calcul, vous pouvez créer les matrices "Position_p" et "Position_q" : Position_p0= [1:P] ; Position_p= Position_p0; for q=1:q-1 Position_p= [Position_p,Position_p0]; Position_q0= [1:Q]; Position_q= Position_q0; for p=1:p-1 Position_q= [Position_q;Position_q0]; Vous avez ainsi la possibilité d utiliser l opérateur produit M atrice1 M atrice2 de Matlab qui permet d obtenir une matrice dont chaque composante (p,q) est le produit de Matrice1(p,q) Matrice2(p,q) : X.* Position_p Pour la seconde partie du recentrage, vous pouvez utiliser les lignes sources suivantes pour assurer la découpe : a1= fix(p/2); b1= fix(q/2); % creation d une image plus grande que X : % ======================================== Xtmp= zeros(p+2*a1,q+2*b1); % On positionne l image X au milieu de Xtmp : % ========================================== Xtmp(a1+1:P+a1,b1+1:Q+b1)= X; % On decoupe : % ============ X= Xtmp(Mp+a1-a:Mp+a1+a,Mq+b1-b:Mq+b1+b); Vous pouvez utiliser l opérateur de concaténation [, ] de Matlab pour recréer une grande image BdD contenant toutes les images retravaillées. - Création des images de "références" : Vous calculerez chaque image en résolvant J = 0.
Cnam - Réf. 18458 - Traitement des images et géométrie - TP 5 - Reconnaissance : Choix de l image "chiffre" X à reconnaitre puis détermination de α en utilisant la méthode du gradient simple à pas optimal. 4.2 L application numérique Vous utiliserez l image BdD.jpg. Et vous prrez : seuil = 0.1,P = 112,Q = 110,a = 25,b = 25 Puis vous essayerez de reconnaitre les chiffres contenus dans les images : X 3 0,X 1 1,X 7 2,X 4 3,X 9 4;X 6 5,X 2 6,X 8 7,X 3 8,X 1 9. Pour la méthode du gradient simple, vous utiliserez le test d arrêt qui arrête le processus itératif quand la norme du résidu est inférieur à la norme du second membre divisée par 1000. Pour chacune de ces images, vous donnerez le vecteur α ainsi que le nombre d itération pour vérifier le test d arrêt et vous dégagerez le numéro de la composante de α ayant la valeur maximale pour ainsi vérifier si le chiffre a bien été reconnu. Commentez vos résultats. Attention : Ce TP ne sera pas noté. Il vous est proposé uniquement pour illustrer certains aspects développés en cours et en ED. 5 Les sources du travail demandé % donnees et parametres % ===================== fichiers =.../BdD.jpg ; n= 112; m= 110; % dimensions de chaque image (avant decoupage) a2= 25; b2= 25; % demi-dimensions de chaque image (cf. decoupage) Choixi = 5; Choixj = 8; % Pour le choix de l image a identifier seuil = 0.1; Eps = 0.001; % ===================== [f,dimiy,dimix] = LectureImage(fichiers); f = Normalisation(f); Tout= f(1:10*n,1:10*m);
Cnam - Réf. 18458 - Traitement des images et géométrie - TP 6 % calcul des matrices Position_i et Position_j % utiles ppour le calcul du centre des images. % ============================================ Position_i0= [1:n] ; Position_i= Position_i0; for j=1:m-1 Position_i= [Position_i,Position_i0]; Position_j0= [1:m]; Position_j= Position_j0; for i=1:n-1 Position_j= [Position_j;Position_j0]; % ============================================ % seuillage, centrage et decoupage % on stocke tout dans ---> Tout2 % ================================ Y= Tout(1+i*n:(i+1)*n,1+j*m:(j+1)*m); % seuillage et inverse du 0 et du 1 % ================================= [Y]= Binarisation(Y,seuil,0); Y= abs(y -1); % ================================= % calcul du centre % ================ nb= sum(sum(y)); Mi= fix(sum(sum(y.*position_i))/nb); Mj= fix(sum(sum(y.*position_j))/nb); % ================ % decoupe % ======= a= fix(n/2); b= fix(m/2); Ytmp= zeros(n+2*a,m+2*b); Ytmp(a+1:n+a,b+1:m+b)= Y; Y= Ytmp(Mi+a-a2:Mi+a+a2,Mj+b-b2:Mj+b+b2); % ======= if ( j== 0 ) X= Y; else X= [X,Y];
Cnam - Réf. 18458 - Traitement des images et géométrie - TP 7 if ( i==0 ) Tout2= X; else Tout2= [Tout2,X ] ; % ================================ % nouvelles dimensions de chaque image % ==================================== n= 2*a2+1; m= 2*b2+1; % ==================================== % determination des images "references" (les moyennes!!!) % on les stocke dans ---> Tout3 % ======================================================== Moyenne= zeros(n,m); Y= Tout2(1+i*n:(i+1)*n,1+j*m:(j+1)*m); Moyenne= Moyenne + Y; Moyenne = Moyenne/10; if ( i==0 ) Tout3= Moyenne; else Tout3= [Tout3,Moyenne ] ; % ======================================================== % Choix d une image dans Tout2 % ============================ X= Tout2(1+Choixi*n:(Choixi+1)*n,1+Choixj*m:(Choixj+1)*m); % ============================ % construction de la matrice et du second membre associes % au probleme de moindres carres. % ======================================================= Yi= Tout3(1+i*n:(i+1)*n,1:m); Yj= Tout3(1+j*n:(j+1)*n,1:m); Mat(i+1,j+1) = sum(sum(yi.*yj)); b(j+1) = sum(sum(yj.*x));
Cnam - Réf. 18458 - Traitement des images et géométrie - TP 8 % ======================================================= % processus de resolution % par la methode du gradient simple a pas constant % ================================================ alfa= b*0; test= norm(b); iter= 0; while ( test > Eps*norm(b) & iter < 1000) iter= iter + 1; % calcul du residu % ================ residu= b; residu(i+1)= residu(i+1) - Mat(i+1,j+1)*alfa(j+1); % ================ % calcul du rho optimal % ===================== Ar= residu*0; Ar(i+1)= Ar(i+1) - Mat(i+1,j+1)*residu(j+1); r2 = sum(residu.*residu); Arr= sum(ar.*residu); rho= - r2/arr % ===================== alfa= alfa + rho*residu; test= norm(residu); % ================================================