gilou Modérateur Modzilla | Comme je n'aime pas qu'on supprime un code posté ici, je le remet, mais juste un poil formaté, parce que ce qui était posté ici était complètement illisible.
Et si on pond du code illisible, on ne peut pas se relire, et donc on ne peut pas corriger correctement son code.
Code :
- #include <stdio.h>
- #include <stdlib.h>
- #include "libbmp.h" // permet de travailler sur des images au format .bmp
- //prototypes
- t_bmp bordure(t_bmp);
- t_bmp LPE(t_bmp);
- t_bmp dilatation(t_bmp, t_bmp);
- // declaration de variables
- char image[60],car;
- t_bmp bmp,bmp1,bmp2,bmp3;
- int a=0,b=0,c=0, i, k, savi, j, savj, l, largeur, longueur, longueur2,test,test1,test2,test3,nbrbille=0,current = 10;
- const int z=100;
- double bille;
- long repere;
- FILE *texte;
- int main(int argc, const char * argv[])
- {
- while(1) {
- sprintf(image, argv[2]); //choix du nom de l'image
- test = libbmp_load(image, &bmp); //ouvre l'image au format .bmp
- if(test) {
- texte = fopen(argv[1],"at" ); //ouverture d'un fichier texte
- fseek(texte, current, SEEK_SET);
- car = fgetc(texte);
- while(car != '\n') {
- if(ftell(texte)==0) {
- break;
- }
- current--;
- fseek(texte, current, SEEK_SET);
- car = fgetc (texte);
- }
- fgets(image, 60, texte);
- fprintf(texte,"%s\n",image); //ecriture du nom de l'image dans le fichier texte
- /******************elimination des billes en bordure *********************/
- bmp = bordure(bmp); //supprime les billes coupees par les bords de l'image
- /*****************decoupage par LPE**************************************/
- bmp = LPE(bmp); //decolle les billes collees
- /*******************traitement de l'image**************************************/
- a=0;
- b=0;
- c=0;
- for(i=0; i<bmp.width; i++) { //deplacement sur le pixel en largeur
- for(j=0; j<bmp.height; j++) { // deplacement sur les pixel en hauteur
- if(j<bmp.height-2 && j>2) { //supprime les trou pouvant etre present entre les billes
- if(bmp.data[j][i].moy==0
- && (bmp.data[j-2][i].moy==255 || bmp.data[j-1][i].moy==255)
- && (bmp.data[j+2][i].moy==255 || bmp.data[j+1][i].moy==255)
- && bmp.data[j-1][i-1].moy==255
- && bmp.data[j][i-1].moy==255
- && bmp.data[j+1][i-1].moy==255
- && (bmp.data[j+1][i+1].moy==255 || bmp.data[j+2][i+1].moy==255)) {
- bmp.data[j][i].moy=255;
- }
- }
- }
- }
- for(i=0; i<bmp.width; i++) { //deplacement sur le pixel en largeur
- for(j=0; j<bmp.height; j++) { // deplacement sur les pixel en hauteur
- a+=20; //labellisation des billes
- if(a>255) {
- a=0;
- b+=20;
- }
- if(b>255) {
- b=0;
- c+=20;
- }
- if(bmp.data[j][i].moy==255) { //recherche de pixel blanc
- longueur2=0; //initialisation des valeurs
- largeur=0;
- bille=0;
- savi=i; //sauvegarde la position du point
- savj=j;
- do { //double boucle pour compter la taille d'un bille et la supprimer de l'image
- do {
- if(j<bmp.height-1 && j>0)
- if(bmp.data[j][i+1].moy==255
- && bmp.data[j+3][i+1].moy==255
- && bmp.data[j+1][i+1].moy==255
- && bmp.data[j-3][i+1].moy==255
- && bmp.data[j-1][i+1].moy==255
- && bmp.data[j-2][i+1].moy==255
- && bmp.data[j+2][i+1].moy==255) {
- savj=j;
- }
- longueur++;
- bmp.data[j][i].moy=(a+b+c)/3; //change la couleur du pixel
- // bmp.data[j][i].r=a;
- // bmp.data[j][i].b=b;
- // bmp.data[j][i].g=c;
- j++;
- if(j==bmp.height) {
- break;
- }
- } while(bmp.data[j][i].moy==255);
- j=savj;
- i++;
- if(j>0) {
- while(bmp.data[j-1][i].moy==255 && j>1) {
- j--;
- if(bmp.data[j-1][i].moy==0 && bmp.data[j-2][i].moy==255 && bmp.data[j-2][i-1].moy==((a+b+c)/3)) {
- bmp.data[j-1][i].moy=255;
- }
- }
- }
- largeur++;
- if(longueur>longueur2) { //cherche la longueur la plus grande
- longueur2=longueur;
- }
- longueur=0;
- } while(bmp.data[j][i].moy==255);
- if(longueur2>8 && largeur>8) { //difference entre bille et parasite
- if(longueur2>largeur) { //cherche la valeur la plus grande
- bille=longueur2 * 0.07716 + 0.1543; //calcul pour avoir le resultat en millimetre
- } else {
- bille=largeur * 0.07716 +0.1543;
- }
- if(bille<8) {
- fprintf(texte,"%.2f\n",bille); //ecrit le resultat dans le fichier texte
- nbrbille ++;
- // printf("%.2f\n",bille); //debugage
- }
- }
- i=savi; //retourne au point sauvegardé
- j=savj;
- }
- }
- } //prepare l'ouverture de la prochaine image
- fprintf(texte,"il y a %d bille(s) sur l'image\n",nbrbille);
- fclose(texte);
- for (i = 0; i < bmp.height; i++) {
- free(bmp.data[i]);
- }
- free(bmp.data);
- remove(image);
- nbrbille=0;
- }
- }
- }
- /***********sous programme**************/
- t_bmp bordure(t_bmp bmp)
- {
- int i;
- for (i = 0; i < bmp.width; ++i) { // supprime toutes les billes touchant le bas de l'image
- j=0;
- if(bmp.data[j][i].moy < z) {
- savi=i;
- do {
- do {
- bmp.data[j][i].moy=255;
- i++;
- if(i==bmp.width) {
- break;
- }
- } while(bmp.data[j][i].moy<z);
- i=savi;
- j++;
- if(j==bmp.height) {
- break;
- }
- if(bmp.data[j][i].moy>z) {
- if(i<bmp.width-1) {
- if(bmp.data[j][i+1].moy<z) {
- i=i+1;
- savi=i;
- }
- }
- } else {
- while(bmp.data[j][i-1].moy<z && i>1) {
- i--;
- }
- }
- } while(bmp.data[j][i].moy<z);
- }
- }
- for(i=0; i<bmp.width; i++) { // supprime toutes les billes touchant le haut de l'image
- j=bmp.height-1;
- if(bmp.data[j][i].moy<z) {
- savi=i;
- do {
- do {
- bmp.data[j][i].moy=255;
- i++;
- if(i==bmp.width) {
- break;
- }
- } while(bmp.data[j][i].moy<z);
- i=savi;
- j--;
- if(bmp.data[j][i].moy>z) {
- if(i<bmp.width-1) {
- if(bmp.data[j][i+1].moy<z) {
- i=i+1;
- savi=i;
- }
- }
- } else {
- while(bmp.data[j][i-1].moy<z && i>1) {
- i--;
- }
- }
- } while(bmp.data[j][i].moy<z && i<bmp.width-1);
- }
- }
- for(j=0; j<bmp.height; j++) { // supprime toutes les billes touchant le bord gauche de l'image
- i=0;
- if(bmp.data[j][i].moy<z) {
- savj=j;
- do {
- do {
- bmp.data[j][i].moy=255;
- j++;
- if(j==bmp.height) {
- break;
- }
- } while(bmp.data[j][i].moy<z);
- j=savj;
- i++;
- if(i<bmp.width-1) {
- if(bmp.data[j][i].moy>z) {
- if(j<bmp.height-1) {
- if(bmp.data[j+1][i].moy<z) {
- j=j+1;
- savj=j;
- }
- }
- } else {
- while(bmp.data[j-1][i].moy<z) {
- j--;
- if(j==0) {
- break;
- }
- }
- }
- }
- } while(bmp.data[j][i].moy<z && j<bmp.height-1);
- }
- }
- for(j=0; j<bmp.height; j++) { // supprime toutes les billes touchant le bord droit de l'image
- i=bmp.width-1;
- if(bmp.data[j][i].moy<z) {
- savj=j;
- do {
- do {
- bmp.data[j][i].moy=255;
- j++;
- if(j==bmp.height) {
- break;
- }
- } while(bmp.data[j][i].moy<z);
- j=savj;
- i--;
- if(bmp.data[j][i].moy>z) {
- if(j<bmp.height-1) {
- if(bmp.data[j+1][i].moy<z) {
- j=j+1;
- savj=j;
- }
- }
- } else {
- while(bmp.data[j-1][i].moy<z && j>1) {
- j--;
- }
- }
- } while(bmp.data[j][i].moy<z && j<bmp.height-1);
- }
- }
- return bmp;
- }
- /********************LPE*******************************/
- t_bmp LPE(t_bmp bmp)
- {
- libbmp_load(image, &bmp1);
- libbmp_load(image, &bmp2);
- libbmp_load(image, &bmp3);
- int fin=0;
- for(i=0; i<bmp.width; i++) { //deplacement sur le pixel en largeur
- for(j=0; j<bmp.height; j++) { // deplacement sur les pixel en hauteur
- if(bmp.data[j][i].moy>z) {
- bmp.data[j][i].moy=255;
- /*bmp.data[j][i].r=255;bmp.data[j][i].g=255;bmp.data[j][i].b=255;*/
- } //transforme l'image en image binaire
- if(bmp.data[j][i].moy<z) {
- bmp.data[j][i].moy=0;
- /*bmp.data[j][i].r=0;bmp.data[j][i].g=0;bmp.data[j][i].b=0;*/
- }
- bmp.data[j][i].moy= 255 - bmp.data[j][i].moy;
- //bmp.data[j][i].r= 255 - bmp.data[j][i].r;bmp.data[j][i].g= 255 - bmp.data[j][i].g;bmp.data[j][i].b= 255 - bmp.data[j][i].b;
- }
- }
- for(i=1; i<bmp.width-1; i++) { //deplacement sur le pixel en largeur
- for(j=1; j<bmp.height-1; j++) { // deplacement sur les pixel en hauteur
- //premiere erosion
- if(bmp.data[j][i].moy==255
- && bmp.data[j-1][i].moy==255
- && bmp.data[j][i-1].moy==255
- && bmp.data[j+1][i].moy==255
- && bmp.data[j][i+1].moy==255) {
- bmp1.data[j][i].moy=255;
- //bmp1.data[j][i].r=255;bmp1.data[j][i].g=255;bmp1.data[j][i].b=255;
- } else if(bmp.data[j][i].moy==0
- || bmp.data[j-1][i].moy==0
- || bmp.data[j][i-1].moy==0
- || bmp.data[j+1][i].moy==0
- || bmp.data[j][i+1].moy==0) {
- bmp1.data[j][i].moy=0;//bmp1.data[j][i].r=0;bmp1.data[j][i].g=0;bmp1.data[j][i].b=0;
- }
- }
- }
- do { //erosion de taille 9
- fin++;
- for(i=1; i<bmp.width-1; i++) { //deplacement sur le pixel en largeur
- for(j=1; j<bmp.height-1; j++) { // deplacement sur les pixel en hauteur
- if(bmp1.data[j][i].moy==255
- && bmp1.data[j-1][i].moy==255
- && bmp1.data[j][i-1].moy==255
- && bmp1.data[j+1][i].moy==255
- && bmp1.data[j][i+1].moy==255
- && bmp1.data[j-1][i+1].moy==255
- && bmp1.data[j+1][i+1].moy==255
- && bmp1.data[j-1][i-1].moy==255
- && bmp1.data[j+1][i-1].moy==255) {
- bmp2.data[j][i].moy=255;
- //bmp2.data[j][i].r=255;bmp2.data[j][i].g=255;bmp2.data[j][i].b=255;
- } else if(bmp1.data[j][i].moy==0
- || bmp1.data[j-1][i].moy==0
- || bmp1.data[j][i-1].moy==0
- || bmp1.data[j+1][i].moy==0
- || bmp1.data[j][i+1].moy==0
- || bmp1.data[j-1][i+1].moy==0
- || bmp1.data[j+1][i+1].moy==0
- || bmp1.data[j-1][i-1].moy==0
- || bmp1.data[j+1][i-1].moy==0) {
- bmp2.data[j][i].moy=0;
- //bmp2.data[j][i].r=0;bmp2.data[j][i].g=0;bmp2.data[j][i].b=0;
- }
- }
- }
- for(i=0; i<bmp.width; i++) { //deplacement sur le pixel en largeur
- for(j=0; j<bmp.height; j++) { // deplacement sur les pixel en hauteur
- bmp1.data[j][i].moy = bmp2.data[j][i].moy;
- }
- }
- } while(fin != 9);
- // sprintf(nouvelle,"image%dbmp1.bmp",k);
- // libbmp_write(nouvelle,&bmp1); //debugage
- bmp3=dilatation(bmp2,bmp3); //dilatation
- // sprintf(nouvelle,"image%dbmp2.bmp",k);
- // libbmp_write(nouvelle,&bmp2); //debugage
- // sprintf(nouvelle,"image%dbmp3.bmp",k);
- // libbmp_write(nouvelle,&bmp3); //debugage
- for(i=0; i<bmp.width; i++) { //deplacement sur le pixel en largeur
- for(j=0; j<bmp.height; j++) { // deplacement sur les pixel en hauteur
- bmp.data[j][i].moy *= bmp3.data[j][i].moy; //decolle les billes collées
- if(bmp.data[j][i].moy != 0) { // transforme l'image en image binaire
- bmp.data[j][i].moy=255;
- }
- }
- }
- for (i = 0; i < bmp.height; i++) {
- free(bmp1.data[i]);
- free(bmp2.data[i]);
- free(bmp3.data[i]);
- }
- free(bmp1.data);
- free(bmp2.data);
- free(bmp3.data);
- return bmp;
- }
- t_bmp dilatation (t_bmp bmp2,t_bmp bmp3)
- {
- a=0;
- b=0;
- c=0;
- int l, fin=0;
- for(i=0; i<bmp2.width; i++) { //deplacement sur le pixel en largeur
- for(j=0; j<bmp2.height; j++) { // deplacement sur les pixel en hauteur
- a+=20; //labelisation de l'image
- if(a>255) {
- a=0;
- b+=20;
- }
- if(b>255) {
- b=0;
- c+=20;
- }
- if(bmp2.data[j][i].moy==255) { //recherche de pixel blanc
- savi=i; //sauvegarde la position du point
- savj=j;
- do {//double boucle pour labelisé les billes
- do {
- bmp2.data[j][i].moy=(a+b+c)/3; //change la couleur du pixel
- //bmp2.data[j][i].r=a;
- //bmp2.data[j][i].b=b;
- //bmp2.data[j][i].g=c;
- j++;
- if(j==bmp2.height) {
- break;
- }
- } while(bmp2.data[j][i].moy==255);
- j=savj;
- i++;
- if(bmp2.data[j][i].moy==0) {
- for(l=1; l<15; l++) {
- if(bmp2.data[j+l][i].moy==255) {
- j=j+l;
- savj=j;
- break;
- }
- }
- } else {
- if(j>0) {
- while(bmp2.data[j-1][i].moy==255 && j>1) {
- j--;
- }
- }
- }
- } while(bmp2.data[j][i].moy==255);
- j=savj;
- i=savi;
- }
- }
- }
- for(i=0; i<bmp2.width; i++) { //deplacement sur le pixel en largeur
- for(j=0; j<bmp2.height; j++) { // deplacement sur les pixel en hauteur
- bmp3.data[j][i].moy = bmp2.data[j][i].moy; //copie de donnée
- // bmp3.data[j][i].r = bmp2.data[j][i].r;
- // bmp3.data[j][i].g = bmp2.data[j][i].g;
- // bmp3.data[j][i].b = bmp2.data[j][i].b;
- }
- }
- // sprintf(nouvelle,"image%dbmp31.bmp",k);
- // libbmp_write(nouvelle,&bmp3); //debugage
- do { //dilatation sous contrainte de 40
- fin++;
- for(i=2; i<bmp2.width-2; i++) { //deplacement sur le pixel en largeur
- for(j=2; j<bmp2.height-2; j++) { // deplacement sur les pixel en hauteur
- if(bmp2.data[j][i].moy!=0) {
- if(bmp2.data[j-1][i].moy==0) {
- if(((bmp2.data[j-2][i].moy==0 || bmp2.data[j-2][i].moy==bmp2.data[j][i].moy)
- && (bmp3.data[j-2][i].moy==0 || bmp3.data[j-2][i].moy==bmp2.data[j][i].moy))
- && ((bmp2.data[j-2][i+1].moy==0 || bmp2.data[j-2][i+1].moy==bmp2.data[j][i].moy)
- && (bmp3.data[j-2][i+1].moy==0 || bmp3.data[j-2][i+1].moy==bmp2.data[j][i].moy))
- && ((bmp2.data[j-2][i-1].moy==0 || bmp2.data[j-2][i-1].moy==bmp2.data[j][i].moy)
- && (bmp3.data[j-2][i-1].moy==0 || bmp3.data[j-2][i-1].moy==bmp2.data[j][i].moy))) {
- bmp3.data[j-1][i].moy=bmp3.data[j][i].moy;
- //bmp3.data[j-1][i].r=bmp3.data[j][i].r;bmp3.data[j-1][i].g=bmp3.data[j][i].g;bmp3.data[j-1][i].b=bmp3.data[j][i].b;
- }
- }
- if(bmp2.data[j+1][i].moy==0) {
- if(((bmp2.data[j+2][i].moy==0 || bmp2.data[j+2][i].moy==bmp2.data[j][i].moy)
- && (bmp3.data[j+2][i].moy==0 || bmp3.data[j+2][i].moy==bmp2.data[j][i].moy))
- && ((bmp2.data[j+2][i+1].moy==0 || bmp2.data[j+2][i+1].moy==bmp2.data[j][i].moy)
- && (bmp3.data[j+2][i+1].moy==0 || bmp3.data[j+2][i+1].moy==bmp2.data[j][i].moy))
- && ((bmp2.data[j+2][i-1].moy==0 || bmp2.data[j+2][i-1].moy==bmp2.data[j][i].moy)
- && (bmp3.data[j+2][i-1].moy==0 || bmp3.data[j+2][i-1].moy==bmp3.data[j][i].moy))) {
- bmp3.data[j+1][i].moy=bmp3.data[j][i].moy;
- //bmp3.data[j+1][i].r=bmp3.data[j][i].r;bmp3.data[j+1][i].g=bmp3.data[j][i].g;bmp3.data[j+1][i].b=bmp3.data[j][i].b;
- }
- }
- if(bmp2.data[j][i+1].moy==0) {
- if(((bmp2.data[j][i+2].moy==0 || bmp2.data[j][i+2].moy==bmp2.data[j][i].moy)
- && (bmp3.data[j][i+2].moy==0 || bmp3.data[j][i+2].moy==bmp2.data[j][i].moy))
- && ((bmp2.data[j-1][i+2].moy==0 || bmp2.data[j-1][i+2].moy==bmp2.data[j][i].moy)
- && (bmp3.data[j-1][i+2].moy==0 || bmp3.data[j-1][i+2].moy==bmp2.data[j][i].moy))
- && ((bmp2.data[j+1][i+2].moy==0 || bmp2.data[j+1][i+2].moy==bmp2.data[j][i].moy)
- && (bmp3.data[j+1][i+2].moy==0 || bmp3.data[j+1][i+2].moy==bmp2.data[j][i].moy))) {
- bmp3.data[j][i+1].moy=bmp3.data[j][i].moy;
- //bmp3.data[j][i+1].r=bmp3.data[j][i].r;bmp3.data[j][i+1].g=bmp3.data[j][i].g;bmp3.data[j][i+1].b=bmp3.data[j][i].b;
- }
- }
- if(bmp2.data[j][i-1].moy==0) {
- if(((bmp2.data[j][i-2].moy==0 || bmp2.data[j][i-2].moy==bmp2.data[j][i].moy)
- && (bmp3.data[j][i-2].moy==0 || bmp3.data[j][i-2].moy==bmp2.data[j][i].moy))
- && ((bmp2.data[j-1][i-2].moy==0 || bmp2.data[j-1][i-2].moy==bmp2.data[j][i].moy)
- && (bmp3.data[j-1][i-2].moy==0 || bmp3.data[j-1][i-2].moy==bmp2.data[j][i].moy))
- && ((bmp2.data[j+1][i-2].moy==0 || bmp2.data[j+1][i-2].moy==bmp2.data[j][i].moy)
- && (bmp3.data[j+1][i-2].moy==0 || bmp3.data[j+1][i-2].moy==bmp2.data[j][i].moy))) {
- bmp3.data[j][i-1].moy=bmp3.data[j][i].moy;
- //bmp3.data[j][i-1].r=bmp3.data[j][i].r;bmp3.data[j][i-1].g=bmp3.data[j][i].g;bmp3.data[j][i-1].b=bmp3.data[j][i].b;
- }
- }
- }
- bmp2.data[j][i].moy = bmp3.data[j][i].moy;
- }
- }
- } while(fin!= 40);
- return bmp3;
- }
|
C'est quasiment un cas d'école de tout ce qu'il ne faut pas faire, ce truc.
On va pouvoir détailler.
A+, Message édité par gilou le 19-04-2013 à 13:57:11 ---------------
There's more than what can be linked! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! --
|