Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 16/03/2007, à 14:33

catwoman

[C++]Qu'est-ce qu'un pixel ?

Bonjour,

j'ai écrit un petit programme permettant d'afficher des pixels d'une image.
Mon image fait 400x300 pixels.
Pour l'affichage, je l'ai divisé par 40 pour la largeur et 30 pour la hauteur.
Voici ce que j'obtiens :

largeur = 400, hauteur = 300
210090 210090 275883 341676 341677 407470 473265 473265 670390 670392
210090 210090 275883 341676 341677 407470 473265 473265 670390 670390
210090 210090 275883 341676 341677 407470 473265 473265 670390 670392
210090 210090 275883 341676 341677 407470 473265 473265 604597 604597
210090 210090 275883 341676 341677 407470 473265 473265 604597 604599
210090 210090 275883 341676 341677 407470 473265 473265 538804 604597
210090 210090 275883 341676 341677 407470 473265 473265 538804 538806
210090 210090 275883 341676 341677 407470 473265 473265 538804 538804
210090 210090 210090 275883 275884 341677 341679 341679 473011 473013
210090 210090 210090 275883 275884 341677 341679 341679 473011 473011

Mon programmme :

#include <iostream>
#include <string>
#include <gd.h>
#include <stdio.h>
#include <stdlib.h>


using namespace std;

class Test{
public:
  Test(char *nom){
   gdImagePtr im;
   int x,y;
   FILE *in = fopen(nom, "rb");
   if (in == NULL) {
    fprintf(stderr,"Erreur dans l'ouverture du fichier\n");
    exit(-1);
   }
   im = gdImageCreateFromJpeg(in);
   fclose(in);
   cout << "largeur = " << gdImageSX(im) << ", hauteur = " << gdImageSY(im) << endl;
   for (x=0;x<gdImageSX(im)/40;x++){
    for (y=0;y<gdImageSY(im)/30;y++){
      cout << gdImageGetPixel(im, x, y) << " ";      
     }
    cout << endl;
   }
   gdImageDestroy(im);
  }
};


int main(){
Test test("beach.jpg");
return 0;
}

Je parcours l'image : (x,y) sont les coordonnées du pixel mais ce qui est affiché correspond à quoi ?

De plus, dans la bibilothèque GD, une image est contenue dans

unsigned char ** pixels;

Je souhaite faire une rotation d'une image donc il faut pour chaque pixel que j'applique cette rotation.
Admettons que je fasse tourner un point (1,2) d'un angle de 60°
Le nouveau point sera en (-0.366025,1.36603).
Comment faire pour le stocker sachant que des pixels sont des nombres entiers ?

Merci

Hors ligne

#2 Le 16/03/2007, à 14:36

ffomnislash

Re : [C++]Qu'est-ce qu'un pixel ?

il faut simplement arrondir  lol


-- Mon blog --

Hors ligne

#3 Le 16/03/2007, à 14:46

laurentpoulle

Re : [C++]Qu'est-ce qu'un pixel ?

regarde ici mon ami http://www.siteduzero.com/index.php
ce site est une véritable mine d'or pour résoudre ton probléme
amicalement laurent


:)

Hors ligne

#4 Le 16/03/2007, à 15:05

catwoman

Re : [C++]Qu'est-ce qu'un pixel ?

ffomnislash a écrit :

il faut simplement arrondir  lol

La seule solution est de faire une approximation ?

Hors ligne

#5 Le 16/03/2007, à 16:09

hello_world

Re : [C++]Qu'est-ce qu'un pixel ?

Hello

Tu ne peux pas tourner ton image de 60 degré et avoir exactement la même image à l'arrivée, t'es obligé de faire une approximation(mais alors tu risque de perdre quelques pixel)  ou alors de faire un algo qui te permet de mixer les pixel ... bref, c'est pas si simple ;-)

++

Hors ligne

#6 Le 16/03/2007, à 18:35

catwoman

Re : [C++]Qu'est-ce qu'un pixel ?

hello_world a écrit :

Hello

Tu ne peux pas tourner ton image de 60 degré et avoir exactement la même image à l'arrivée, t'es obligé de faire une approximation(mais alors tu risque de perdre quelques pixel)  ou alors de faire un algo qui te permet de mixer les pixel ... bref, c'est pas si simple ;-)

++

Ok donc je fais une apporximation.
Mais il reste un autre soucis car les Pixels peuvent avoir des coordonnées négatives après une rotation.
Comment faire dans ce cas ?

Merci

Hors ligne

#7 Le 17/03/2007, à 12:29

Pistolero

Re : [C++]Qu'est-ce qu'un pixel ?

Salut,
effectivement c'est pas si simple et pour cause, pour obtenir un résultat parfait de ton image par rotation la technique est la suivante, avec l'image d'origine im et ton image résultat im_r :

1- Calculer la matrice de transformation rotation pour passer de l'image d'origine im à ton image transformé im_r (à partir de l'angle de rotation).

2- Par transformation calculer les 4 coins de l'image transformée im_r à partir des 4 coins de l'image d'origine im, cela permet de connaître la dimension exacte de l'image im_r (bouding box).

3- Créer l'image vide im_r à la taille de la bounding box.

4- Pour chaque point de l'image im_r utiliser la transformation inverse pour aller chercher l'intensité du pixel dans l'image d'origine im et le copier dans im_r. Cette méthode c'est le backward mapping, elle permet d'éviter l'apparition de troue dans l'image résultat à cause des approximations. Si le point que tu cherches est en dehors de l'image d'origine tu affectes la valeur 0.

5- Utiliser une méthode d'interpolation (voisin proche, bilinéaire, bicubic, ...) dans le choix de l'intensité du pixel dans l'image d'origine. C'est à dire au lieu de pendre directement l'arrondi de la position du point dans l'image d'origine il faut utiliser les intensités des pixels connexes pour obtenir l'intensité à copier dans l'image résultat. En faite cela permet d'avoir de l'anti-aliasing (anti crènelage).

Voila, en gros c'est comme çà (en faisant vite), je ne suis pas rentré dans les détails. Alors maintenant c'est soit tu as beaucoup de courage big_smile ou soit tu te trouves une fonction ou bibliothèque qui fait la rotation.

++


Desole pour les accents, je suis esclave d'un qwerty.

Hors ligne