IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Problème d'affichage aléatoire


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de bahiatoon
    Inscrit en
    Juillet 2006
    Messages
    169
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juillet 2006
    Messages : 169
    Par défaut Problème d'affichage aléatoire
    Salut,

    J'ai un problème avec mon programme , lorsque je l'exécute des fois il m'affiche le résultat que je cherche et des fois il m'affiche une image noire (je fais du traitement d'images)

    Le voici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    byte image[1000][1000];
    byte Image[1000][1000];
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    int tri[99999];
    H=Image1->Picture->Bitmap->Height;
    W=Image1->Picture->Bitmap->Width;
    for(int x=0;x<W;x++)
            for(int y=0;y<H;y++)
            {
            a=Image1->Picture->Bitmap->Canvas->Pixels[x][y];
            b=a%256;
            g=(a/256)%256;
            r=(a/(256*256))%256;
            Image[x][y]=(int)(r*0.299+g*0.587+b*0.114);
            }
    Form8->ShowModal();
    float n,m;
    n= StrToFloat(Form8->Edit1->Text);
    int px, py;
    double d;
    int i,j,x,y,l;
    int max;
    for(x = 0; x < W; x++)
        for(y = 0; y < H; y++)
           {
           int k=1;
           for (i = -n; i <= +n; i++)
               {
               px = x + i;
               for(j = -n; j <= +n; j++)
                  {
                   py = y + j;
                   if((px >= 0) && (px < W) && (py >= 0) && (py < H))
                     {
                      //d = hypot( i,j);
                    d=(x-px)*(x-px)+(y-py)*(y-py);
                      if (d <= n*n)
                         {
                         tri[k]=Image[px][py];
                         k=k+1;
                         }
                       }
                    }
                 }
                 max=tri[1];
                 for (l=2;l<=k;l++)  {
                                         if (max>tri[l])max=tri[l];
                                         }
    image[x][y]=max;
            }
     
    for(x=0;x<W;x++)
        for(y=0;y<H;y++)
        {
        Image1->Canvas->Pixels[x][y]=(TColor)((int)(image[x][y]+256*image[x][y]+256*256*image[x][y]));
        }
    Si vous avez une petite idée pensez à me laisser un message

    A+

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    C'est pour faire quoi au juste ce coup ci ?

    On a toujours le même problème de lieux géographiques (points appartenant à un disque) ?

    Pourquoi d <= n*n ?

    A plus !

  3. #3
    Membre confirmé Avatar de bahiatoon
    Inscrit en
    Juillet 2006
    Messages
    169
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juillet 2006
    Messages : 169
    Par défaut


    Pourquoi d <= n*n ?
    parce que je n'ai pas utilisé le SQRT ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     d=(x-px)*(x-px)+(y-py)*(y-py);
    pour gagner en temps d'exécution.

    Ce programme fait une érosion de l'image en utilisant comme élément structurant un disque de rayon n.

    A+

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Si on doit optimiser, alors je te conseille de précalculer les points du disque.
    Pour un disque de rayon r, on a r² * pi points dont on peut précacluler les offsets par rapport au centre du disque qui glisse en x et en y.
    C'est ce que j'avais montré dans une discussion précédente.

    Pour le problème en cours... je ne vois pas ce qui pose problème dans le code que tu donnes sauf trois questions :

    - Que vient faire le showModal dans cette affaire ?
    - Est-ce que tout est parfaitement initialisé ?
    - Quel est le principe de l'érosion ici ?

    tri[k]=Image[px][py];
    k=k+1;
    ...
    max=tri[1];
    for (l=2;l<=k;l++)
    if (max>tri[l])max=tri[l];
    ...
    image[x][y]=max;
    Il me semble que l'on a intérêt à faire :

    max = 0;
    ...
    if(max < Image[..][..]) max = Image[..][..];
    ...
    image[x][y]=max;
    Oui ... Non ?

    Rappel : ScanLine est préférable à Pixels[X][Y] !

    A plus !

  5. #5
    Membre confirmé Avatar de bahiatoon
    Inscrit en
    Juillet 2006
    Messages
    169
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juillet 2006
    Messages : 169
    Par défaut
    Salut,
    Que vient faire le showModal dans cette affaire ?
    c'est pour faire apparaitre une boite de dialogue qui permet de choisir le rayon du disque
    Quel est le principe de l'érosion ici
    on attribue à chaque pixel central la valeur minimale de ses voisins(max est seulement le nom que j'ai donné à une variable en réalité je cherche le minimum)
    Est-ce que tout est parfaitement initialisé

    Je pense que ce n'est pas un problème d'optimisation, car j'utilise le même programme qui recherche le maximum au lieu du minimum et je n'ai eu aucun problème avec

    A+

  6. #6
    Membre confirmé Avatar de bahiatoon
    Inscrit en
    Juillet 2006
    Messages
    169
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juillet 2006
    Messages : 169
    Par défaut
    Salut,

    pouvez vous reprendre le code et l'essayer chez vous et me dire ce qu'il vous a affiché

    Merci d'avance.

  7. #7
    Membre confirmé Avatar de bahiatoon
    Inscrit en
    Juillet 2006
    Messages
    169
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juillet 2006
    Messages : 169
    Par défaut
    Salut henderson,

    J'ai repris le code que tu m'as donné dans la discussion précédente, maintenant et grâce à toi l'érosion de l'image se fait normalement mais elle se fait partiellement, il y a une partie de l'image qui reste sans traitement et j'ignore pourquoi
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    int min,px,py;
    H=Image1->Picture->Bitmap->Height;
    W=Image1->Picture->Bitmap->Width;
    for(int x=0;x<W;x++)
            for(int y=0;y<H;y++)
            {
            a=Image1->Picture->Bitmap->Canvas->Pixels[x][y];
            b=a%256;
            g=(a/256)%256;
            r=(a/(256*256))%256;
            Image[x][y]=(int)(r*0.299+g*0.587+b*0.114);
            }
    float d;
    int Ofx[10000];
    int Ofy[10000];
    int NbOf=0;
    for(int y = -10; y <= 10; y++)
        {
        for(int x = -10; x <= 10; x++)
            {
            d = sqrt((x*x) + (y*y)); //un peu plus rapide que hypot
            if(d <= 10)
                {
                Ofx[NbOf] = x;
                Ofy[NbOf] = y;
                NbOf++;
                }
            }
        }
    Byte v;
    for(int y = 0; y < H; y++)
        {
        for(int x = 0; x < W; x++)
            {
            min = 0xFF; //max = 0;
            for(int of=0; of < NbOf; of++)
                {
                px = x + Ofx[of];
                py = y + Ofy[of];
                if((py>=0) && (py<H) && (px>=0) && (px<W))
                    {
                    v = Image[py][px];
                    if(min > v) min = v;
                    }
                }
            image[y][x] = min;
            }
     
        }
    for(int x=0;x<W;x++)
            for(int y=0;y<H;y++)
            {
            Image1->Canvas->Pixels[x][y]=(TColor)((int)(image[x][y]+256*image[x][y]+256*256*image[x][y]));
            }
     
    Image1-> Update();
    A+

  8. #8
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Parce que c'est encore probablement une confusion au niveau de l'accès des tableaux.

    Quand je fais du traitement d'images, j'organise toujours mes tableaux de manière à les lire en tant que :

    Tableau[lignes][colonnes]

    C'est une lecture des pixels qui correspond à leur organisation physique en mémoire, celle en particulier qui est donnée par ScanLine.

    Donc ne pas se mélanger les pinceaux avec les x et y au niveau de l'accès des éléments (Tableau[y][x] -> Pixels[x][y]).

    A plus !

  9. #9
    Membre confirmé Avatar de bahiatoon
    Inscrit en
    Juillet 2006
    Messages
    169
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juillet 2006
    Messages : 169
    Par défaut
    Salut henderson,

    Merci beaucoup pour ton aide tu es vraiment un génie

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème d'affichage aléatoire dans un GridView
    Par boncarmaz dans le forum Android
    Réponses: 1
    Dernier message: 13/06/2014, 16h54
  2. Avec GMail, problème d'affichage d'images aléatoire
    Par agony dans le forum E-Mailing
    Réponses: 4
    Dernier message: 09/11/2012, 14h48
  3. [Kylix] problème d'affichage
    Par scalvi dans le forum EDI
    Réponses: 1
    Dernier message: 18/06/2003, 10h07
  4. Réponses: 1
    Dernier message: 06/03/2003, 11h57
  5. probléme d'affichage d'une fiche
    Par sb dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 09h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo