Transformation de niveau de gris d'une image

Signaler
Messages postés
43
Date d'inscription
dimanche 11 novembre 2007
Statut
Membre
Dernière intervention
21 janvier 2008
-
Messages postés
43
Date d'inscription
dimanche 11 novembre 2007
Statut
Membre
Dernière intervention
21 janvier 2008
-
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

Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
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+
Messages postés
43
Date d'inscription
dimanche 11 novembre 2007
Statut
Membre
Dernière intervention
21 janvier 2008

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
Messages postés
793
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
10 février 2021
8
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
Messages postés
43
Date d'inscription
dimanche 11 novembre 2007
Statut
Membre
Dernière intervention
21 janvier 2008

j'etais dans le CXImage image je n'ai pas pue trouver peux tu m'envoyer le lien?
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
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?
Messages postés
43
Date d'inscription
dimanche 11 novembre 2007
Statut
Membre
Dernière intervention
21 janvier 2008

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)
Messages postés
793
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
10 février 2021
8
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
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
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];
}
  
Messages postés
43
Date d'inscription
dimanche 11 novembre 2007
Statut
Membre
Dernière intervention
21 janvier 2008

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
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
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
Messages postés
43
Date d'inscription
dimanche 11 novembre 2007
Statut
Membre
Dernière intervention
21 janvier 2008

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++
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
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];
Messages postés
43
Date d'inscription
dimanche 11 novembre 2007
Statut
Membre
Dernière intervention
21 janvier 2008

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?
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
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>
Messages postés
43
Date d'inscription
dimanche 11 novembre 2007
Statut
Membre
Dernière intervention
21 janvier 2008

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'
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
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.
Messages postés
43
Date d'inscription
dimanche 11 novembre 2007
Statut
Membre
Dernière intervention
21 janvier 2008

c'est vrai Merci pour l'aide
Messages postés
43
Date d'inscription
dimanche 11 novembre 2007
Statut
Membre
Dernière intervention
21 janvier 2008

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
    }
}
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
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!
Messages postés
1054
Date d'inscription
samedi 2 octobre 2004
Statut
Membre
Dernière intervention
9 juillet 2013
6
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