Transformation de niveau de gris d'une image

laura1978 Messages postés 43 Date d'inscription dimanche 11 novembre 2007 Statut Membre Dernière intervention 21 janvier 2008 - 11 nov. 2007 à 20:58
laura1978 Messages postés 43 Date d'inscription dimanche 11 novembre 2007 Statut Membre Dernière intervention 21 janvier 2008 - 12 nov. 2007 à 17:10
Salut,
Je suis nouvelle dans ce forum et j'ai un probleme en traitement d'image.
je dois ecrire un algo en c++ pour la transformation du niveau de gris d'une image video
en utilisant la formule qui suit, je dois calculer les valeurs de a et b en utilisant la formule suivante:
g'(x,y)= a* g(x,y)3 + b*g(x,y)2

et en tenant compte des conditions suivantes

g'(x,y)=0 für g(x,y)=0 {function minimal}
g'(x,y)=255 für g(x,y)=255 {function maximal}

SVP avez vous une idee car j'ai déjà tout essayée en vain
je serai contente d'avoir votre aide

laura

26 réponses

Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
12 nov. 2007 à 09:17
Salut
Avant de convertir ton image en niveau de gris, il faut que je sache si tu arrives à recupérer dans un tableau les valeurs pour tous les pixels des trois canaux R G et B (rouge vert bleu)
Une fois que tu as réussie à faire cela, tu n'as plus qu'à faire la combinaison que tu veux entre ces trois canaux, pour transformer tes 3 canaux en un seul.

Généralement, il suffit de faire: Gris[i][j]=(Red[i][j]+Green[i][j]+Blue[i][j])/3

A+
0
laura1978 Messages postés 43 Date d'inscription dimanche 11 novembre 2007 Statut Membre Dernière intervention 21 janvier 2008
12 nov. 2007 à 09:27
j'utilise en fait le minapp
mon Programme comence ainsi : je suis allemande et code est commentez en langue allemande

extern FrameGrabber *fg;
extern BYTE *puffer1;        // Originalbild
extern BYTE *puffer2;        // Neunouvelle image

const int links  = Gw_Spreizung_rand;
const int oben   = Gw_Spreizung_rand;
const int rechts = MAX_SPALTE - Gw_Spreizung_rand;
const int unten  = MAX_ZEILE - Gw_Spreizung_rand;

mais ici je dois utiliser plutôt la formule que j'ai donnée en haut une formule pour la transformation non lineaire du niveau de gris
0
cs_louis14 Messages postés 793 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 10 février 2021 8
12 nov. 2007 à 09:37
guten tag

c'est quoi le 2 et le 3  dans la formule, des puissances , des rangs ( je pense plutôt) et la formule ne doit pas être complète, il manque une couleur.
g'(x,y)= a* g(x,y)3 + b*g(x,y)2

va voir du côté de CXImage , il y a une macro dans les sources qui fait cette transformation couleur-> niveau de gris.

louis14
0
laura1978 Messages postés 43 Date d'inscription dimanche 11 novembre 2007 Statut Membre Dernière intervention 21 janvier 2008
12 nov. 2007 à 10:02
j'etais dans le CXImage image je n'ai pas pue trouver peux tu m'envoyer le lien?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
12 nov. 2007 à 10:06
D'après ce que je comprend et dis moi si je me trompe, les pixels de ton anciene image sont codé sur un BYTE!
Un byte c'est 8 bits donc 256 valeurs. Il n'y a donc qu'un canal!
Si tu as une image en couleur en etrée, il faudrait mettre:

extern BYTE *pufferRED;          // Originalbild
extern BYTE *pufferGREEN;     // Originalbild
extern BYTE *pufferBLUE;        // Originalbild

extern BYTE *puffer2;        // Neunouvelle image

Pour calculer a et b, je ne comprend pas bien : normalement, il sont fixé une bonne fois pour toute non?
0
laura1978 Messages postés 43 Date d'inscription dimanche 11 novembre 2007 Statut Membre Dernière intervention 21 janvier 2008
12 nov. 2007 à 10:26
le probleme est que j'aimerai calculer le niveau de gris sur l'ensemble de l'image donc
je fais
extern BYTE *puffer1;        // pour l'image Initiale qui est selon  la formule g(x,y)
extern BYTE *puffer2;        // nouvelle image qui est selon la formule g'(x,y) c.a.d la dérivée de g(x,y)

donc j'ai pas besoin de RGB car je veux calculer ce qu'on appelle en allemand "Grauwert- Spreizung" je ne connais pas la signification exacte en Francais
et donc le prof demander alors de calculer ce "Grauwert- Spreizung" à l'aide de la transformation  non lineaire
qui est alors cette Formule : g'(x,y) = a* g(x,y)3 + b*g(x,y)2 ou je dois à partir des conditions suivantes:
    BYTE gw_max = 0;      //ici  gw_max signifit grauwert maximale
    BYTE gw_min = 255;
determiner les parametres a et b qui me permettrons de resoudre la Transformation non lineare et ensuite je pourrai alors avoir ma nouvelle Image g'(x,y)
0
cs_louis14 Messages postés 793 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 10 février 2021 8
12 nov. 2007 à 10:40
voilà le lien vers CXImage : http://www.codeproject.com/bitmap/cximage.asp
il faut chercher dans le projet, il y une macro commande du genre RGB2GRAY.
A moins que tu dois restaurer les couleurs à partir du niveau de gris ( cf  ximadsp.cpp).

Effectivement, il manque des précisions pour ton image codée en couleurs. j'ai vu des codages où , il y avait g(x,y) pour RED, g(x+1,y) pour GREEN et g(x+2,y) pour BLUE. Est-ce ton cas?




louis14
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
12 nov. 2007 à 10:50
Non Louis, elle a utilisé des notations mathématiques.
g(x,y) représente le niveau de gris du pixel x,y.

Cette notation est utilisée quant tu as un tableau 1D
UCHAR *tab=new UCHAR[Largeur*Hauteur*4];

et la pour balayer ton tab, effectivement tu as:
for(i=0;i<Largeur*Hauteur*4;i+=4)
{
    Blue=tab[i];
    Green=tab[i+1];
    Red=tab[i+2];
}
  
0
laura1978 Messages postés 43 Date d'inscription dimanche 11 novembre 2007 Statut Membre Dernière intervention 21 janvier 2008
12 nov. 2007 à 10:55
le mien je n'ai pas besoin de tenir compte des informations sur des couleurs.
je dois tout simplement resourdre la formule g'(x,y) = a* g(x,y)3 + b*g(x,y)2 donc je cherche un pseudocode pour le resourdre en determinant a et b et tenant compte des Frontieres g'(x,y)=0 pour g(x,y)=0 {ici minimum de la function}et g'(x,y)=255 pour g(x,y)= 255{ici maximum de la function}

donc en fait j'ai une image Video g(x,y) et j'aimerai avoir une nouvelle image g'(x,y) en tenamt compte de cette Transformation non lineare g'(x,y) = a* g(x,y)3 + b*g(x,y)2 c'est tout je n'ai pas besoin d'infos sur le RGB
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
12 nov. 2007 à 11:33
OK je comprend mieux.
Donc en fait ton probleme c'est de déterminer a et b?
Mais a et b doivent etre constant pour tous les pixels de l'image?
La seul solution que je vois est de fixé soit a soit b:
Avec les conditions
g'(x,y)= 0 für g(x,y)=0 {function minimal}
g'(x,y)=255 für g(x,y)=255 {function maximal}

on obtient  3*a + 2*b =1
Tu fixes a et tu calcules b.
une fois que tu as a et b tu peux calculer g'(x,y) grace à ta formule
0
laura1978 Messages postés 43 Date d'inscription dimanche 11 novembre 2007 Statut Membre Dernière intervention 21 janvier 2008
12 nov. 2007 à 11:39
oui tu compris mon problème est de trouver a et b
j'ai essayée coe tu dis j'ai utilisée les
g'(x,y)=0 für g(x,y)=0 {function minimal}
g'(x,y)=255 für g(x,y)=255 {function maximal}
mais je ne me suis pas en sortie car je ne suis pas la meilleur en Math c'est pour celà que je croyais trouvée ici qlq qui pourra m'aider à trouver a et b en Particulier un pseudocode pourque je puisse directement le programmer en c++
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
12 nov. 2007 à 13:04
Ben faudrai faire quelque chose comme ca
int x,y;
double a,b,Coef;

a=10;                  //tu fixes a
b=(1-3*a)/2         //et tu calcules b
Coef=3*a+2*b;
//pour tous les pixels de ton image
for(x=0; x<Largeur ; x++)
  for(y=0; y<Hauteur; y++)
    g'[x][y] = Coef* g[x][y];
0
laura1978 Messages postés 43 Date d'inscription dimanche 11 novembre 2007 Statut Membre Dernière intervention 21 janvier 2008
12 nov. 2007 à 13:56
STP j''avais mal donnée la function car j'ai à faire ici au puissance donc j'ai normalement
g'(x,y) = a* g(x,y)3 +
b*g(x,y)2

c'est pour celà q je ne comprenais pas très bien ton pseudocode.
peux tu m'aider?
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
12 nov. 2007 à 14:12
Et bien ca ne change pas grand chose:
avec la condition g'(x,y)=255 für g(x,y)=255
tu as: 255 = a* 2553 + b*255<sup>2
          </sup>1      = a * 255 ² + b* 255
donc b=(1-255² * a)/255
<sup>
</sup>a=10;                                    //tu fixes a
b=(1-255² * a) / 255;            //et tu calcules b

//pour tous les pixels de ton image
for(x=0; x<Largeur ; x++)
  for(y=0; y<Hauteur; y++)
    g'[x][y] =  a* g[x][y]3 + b*g[x][y]<sup>2

</sup>
0
laura1978 Messages postés 43 Date d'inscription dimanche 11 novembre 2007 Statut Membre Dernière intervention 21 janvier 2008
12 nov. 2007 à 14:44
ok merci j'ai programmer cela avec visual c++ mais il y'a un problème comment calculer le g'(x,y) elle ne reconnaît pas la derivée de g'
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
12 nov. 2007 à 14:57
Toi tu connais g(x,y) tu connais a (parceque tu l'as imposé), tu connais b (par calcul) donc tu peux calculer g'(x,y).

Je suppose que cette fonction  a* g[x][y]3 + b*g[x][y]²  doit approximer la dérivé d'une fonction.
0
laura1978 Messages postés 43 Date d'inscription dimanche 11 novembre 2007 Statut Membre Dernière intervention 21 janvier 2008
12 nov. 2007 à 15:10
c'est vrai Merci pour l'aide
0
laura1978 Messages postés 43 Date d'inscription dimanche 11 novembre 2007 Statut Membre Dernière intervention 21 janvier 2008
12 nov. 2007 à 15:44
Voici comment est mon code maintenant

void gwspreizung(BYTE *puffer,int iRandlinks, int iRandrechts, int iRandoben, int iRandunten)

{
    BYTE gw_max = 0;
    BYTE gw_min = 255;
    BYTE gw_act;
    float a, b;

     a=10;
     b=(1-(255*255 * a))/255;   

    int i, x, y;
    int iZeilenPos;

    // Zeilenindex, für die Berechnung innerhalb der Schleifen durch Addition
    iZeilenPos = iRandoben * MAX_SPALTE;                              
    for (y = iRandoben; y < (MAX_ZEILE - iRandunten); y++)
    {
        for (x = iRandlinks; x < (MAX_SPALTE - iRandrechts); x++)
        {
            gw_act = puffer[iZeilenPos + x];
            if (gw_act > gw_max)
                gw_max = gw_act;    // Maximaler Grauwert
            if (gw_act < gw_min)
                gw_min = gw_act;    // Minimaler Grauwert
        }
        iZeilenPos += MAX_SPALTE;    // nächste Zeile
    }
    // Tranformation der Bildpunkte
   
    iZeilenPos = iRandoben * MAX_SPALTE;

    for (y = iRandoben; y < (MAX_ZEILE - iRandunten); y++)
    {
        for (x = iRandlinks; x < (MAX_SPALTE-iRandrechts); x++)

        {
            puffer[i]  = (Byte) a * gw_min * gw_min * gw_min + b (byte)* gw_min * gw_min;
        }

        iZeilenPos += MAX_SPALTE;    // nächste Zeile
    }
}
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
12 nov. 2007 à 15:59
J'ai du mal à suivre mais déjà dans cette ligne:

puffer[i]  = (Byte) a * gw_min * gw_min * gw_min + b (byte)* gw_min * gw_min;

le i tu ne l'as pas initialisés et tu ne l'incremente pas!
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
12 nov. 2007 à 16:05
et de plus gw_min étant une constante, a aussi, b aussi, ton image sera unie!!!
(Byte) a * gw_min * gw_min * gw_min + b (byte)* gw_min * gw_min;

C'est surement pas se que tu veux
0
Rejoignez-nous