Probleme traitement d'image

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
lepiaf31
Messages : 510
Inscription : dim. 25/mars/2007 13:44
Localisation : Toulouse, France
Contact :

Probleme traitement d'image

Message par lepiaf31 »

Bonjour

Je fesais quelques manipulations sur les images quand un petit probleme est survenu. En gros je prends une image, et pour chaque pixel, j'augmente sa composante rouge de 20. Puis je prend la nouvelle image et j'enleve 20 à le constante rouge de chaque pixel. Donc normalement je devrais retomber sur l'image de départ et paf ! ca marche pas ! Voila le resultat:

image de départ:
Image

ajout de rouge:
Image

retour à l'image de depart:
Image

vous voyez, sur la dernière image il y a quelques pixels qui sont completement rouge.
Voici le code que j'ai utilisé:

Code : Tout sélectionner

Procedure CryptImage(File.s)
  If LoadImage(0, File)
    If CreateImage(1, ImageWidth(0), ImageHeight(0), ImageDepth(0))
      For x=0 To ImageWidth(0)-1
        For y=0 To ImageHeight(0)-1
          StartDrawing(ImageOutput(0))
          Color = Point(x,y)
          StopDrawing()
          Red = Red(Color)
          Red = Red+20
          If Red > 255
            Red = Red - 255
          EndIf
          StartDrawing(ImageOutput(1))
          Plot(x,y,RGB(Red, Green(Color), Blue(Color)))
          StopDrawing()
        Next
      Next
      SaveImage(1, "test1.bmp")
    EndIf
  EndIf
EndProcedure

Procedure UncryptImage(File.s)
  If LoadImage(0, File)
    If CreateImage(1, ImageWidth(0), ImageHeight(0), ImageDepth(0))
      For x=0 To ImageWidth(0)-1
        For y=0 To ImageHeight(0)-1
          StartDrawing(ImageOutput(0))
          Color = Point(x,y)
          StopDrawing()
          Red = Red(Color)
          Red = Red-20
          If Red < 255
            Red = Red+255
          EndIf
          StartDrawing(ImageOutput(1))
          Plot(x,y,RGB(Red, Green(Color), Blue(Color)))
          StopDrawing()
        Next
      Next
      SaveImage(1, "test2.bmp")
    EndIf
  EndIf
EndProcedure
          
          
CryptImage("image.bmp")
UncryptImage("test1.bmp")
Donc si quelqu'un sait pourquoi ces petits pixels rouges sont là, ca serait sympa d'éclairer ma lanterne :)
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

Message par tonton »

If Red < 255
Red = Red+255

bizard ca!!! :wink:

sinon, on ne revient pas a l' original quant il y a saturation de la couleur.
lepiaf31
Messages : 510
Inscription : dim. 25/mars/2007 13:44
Localisation : Toulouse, France
Contact :

Message par lepiaf31 »

Ha quel c*n il fallait que je mette
If Red < 0
^^

Merci =)
lepiaf31
Messages : 510
Inscription : dim. 25/mars/2007 13:44
Localisation : Toulouse, France
Contact :

Message par lepiaf31 »

Bon j'ai de nouveau un probleme du meme genre. Cette fois-ci, j'ai simplement modifié les 3 constantes de couleur (rouge, vert et bleu) et voila ce que j'obtien:

Image
Image
Image

Sur la 3e image (décryptée) j'ai quelques pixels qui ne sont pas de la bonne couleur et je ne sais pas pourquoi. Voila le code:

Code : Tout sélectionner

Procedure CryptImage(Image)
  Image2 = 0
  RedAdd = 25
  GreenAdd = 128
  BlueAdd = 212
  
  If IsImage(Image)
    Image2 = CreateImage(#PB_Any, ImageWidth(Image), ImageHeight(Image), ImageDepth(Image))
    If Image2
      For x=0 To ImageWidth(Image)-1
        For y=0 To ImageHeight(Image)-1
          StartDrawing(ImageOutput(Image))
          Color = Point(x,y)
          StopDrawing()
          StartDrawing(ImageOutput(Image2))
          Red = Red(Color)+RedAdd
          Green = Green(Color)+GreenAdd
          Blue = Blue(Color)+BlueAdd
          
          While Red > 255
            Red - 255
          Wend
          While Green > 255
            Green - 255
          Wend
          While Blue > 255
            Blue - 255
          Wend
          Plot(x,y,RGB(Red,Green,Blue))
          StopDrawing()
        Next
      Next
    EndIf
  EndIf
  ProcedureReturn Image2
EndProcedure

Procedure DecryptImage(Image)
  Image2 = 0
  RedAdd = 25
  GreenAdd = 128
  BlueAdd = 212
  
  If IsImage(Image)
    Image2 = CreateImage(#PB_Any, ImageWidth(Image), ImageHeight(Image), ImageDepth(Image))
    If Image2
      For x=0 To ImageWidth(Image)-1
        For y=0 To ImageHeight(Image)-1
          StartDrawing(ImageOutput(Image))
          Color = Point(x,y)
          StopDrawing()
          StartDrawing(ImageOutput(Image2))
          Red = Red(Color) - RedAdd
          Green = Green(Color) - GreenAdd
          Blue = Blue(Color) - BlueAdd
          
          While Red < 0
            Red + 255
          Wend
          While Green < 0
            Green + 255
          Wend
          While Blue < 0
            Blue + 255
          Wend
          Plot(x,y,RGB(Red,Green,Blue))
          StopDrawing()
        Next
      Next
    EndIf
  EndIf
  ProcedureReturn Image2
EndProcedure

If LoadImage(0, "image.bmp")
  Image2 = CryptImage(0)
  SaveImage(Image2, "crypté.bmp")
  Image3 = DecryptImage(Image2)
  SaveImage(Image3, "decrypté.bmp")
EndIf
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Si chaque composante n'avait que deux niveaux. Par exemple, si le rouge n'avait que les valeurs 0 à 1 au lieu de 0 à 255, si tu as un dépassement, tu dois faire un rattrapage du NOMBRE DE NIVEAU (=2) et non de la valeur max (=1).

Résultat: En 256 niveaux par composante, tu dois rattraper par une valeur de 256 et non une valeur de 255.

Code : Tout sélectionner

If Rouge > 255
   Rouge - 256
EndIf
Ensuite, pour ce type d'algorithme, il est plus simple de remplacer ce type de routine

Code : Tout sélectionner

If Rouge > 255
   Rouge - 256
EndIf
par

Code : Tout sélectionner

Rouge & 255
C'est plus simple, plus rapide et ça évite donc de telles erreurs. :wink:

Ollivier
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Ou alors tu utilises pour tes composantes le type .b ou le type .c :)

Code : Tout sélectionner

rouge.b = 250
rouge+15
Debug rouge
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

Message par tonton »

il aura toujours des erreur par ce procédé.
on sait pas ce qui depasse ....

If Rouge > 255 ( ca peut etre 256,278,369 )
Rouge - 256 ( et on enleve 256)
EndIf
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Message par case »

tu fais cela dans quel but ? modifier les valeurs de couleurs pour des effets visuels ou simplement rendre l'image illisible sans la décoder ?

Code : Tout sélectionner

Procedure CryptImage(File.s,out.s)

 If LoadImage(0, File)

  If CreateImage(1, ImageWidth(0), ImageHeight(0), ImageDepth(0))

   For x=0 To ImageWidth(0)-1

    For y=0 To ImageHeight(0)-1

     StartDrawing(ImageOutput(0))

     Color = Point(x,y)

     StopDrawing()
     Red = Red(Color)
     r2=red<<4       
     r3=PeekC(@r2)
     r4=PeekC(@r2+1)
     red=r3|r4



     Green = Green(Color)
     r2=Green<<4       
     r3=PeekC(@r2)
     r4=PeekC(@r2+1)
     Green=r3|r4
     
     
     
     blue = Blue(Color)
     r2=blue<<4       
     r3=PeekC(@r2)
     r4=PeekC(@r2+1)
     blue=r3|r4



     StartDrawing(ImageOutput(1))

     Plot(x,y,RGB(Red, Green, Blue))

     StopDrawing()

    Next

   Next

   SaveImage(1, out.s)

  EndIf

 EndIf

EndProcedure

     
UsePNGImageDecoder()
     

CryptImage("imageoxd.png","test1.bmp")
CryptImage("test1.bmp","test2.bmp")
j'inverse les 4 premier bits avec les 4 dernier bits de chaque composantes rvb de l'image ca donne un resultat illisible et ça restaure l'image parfaitement avec une seule procedure ;)
ImageImage
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

Message par tonton »

ou le bon vieux XOR!

Code : Tout sélectionner

Procedure CryptImage(Image) 
  Image2 = 0 
  RedAdd = 25 
  GreenAdd = 128 
  BlueAdd = 212 
  
  If IsImage(Image) 
    Image2 = CreateImage(#PB_Any, ImageWidth(Image), ImageHeight(Image), ImageDepth(Image)) 
    If Image2 
      For x=0 To ImageWidth(Image)-1 
        For y=0 To ImageHeight(Image)-1 
          StartDrawing(ImageOutput(Image)) 
          Color = Point(x,y) 
          StopDrawing() 
          StartDrawing(ImageOutput(Image2)) 
          Red = Red(Color)!RedAdd
          Green = Green(Color)!GreenAdd 
          Blue = Blue(Color)!BlueAdd 
          
       
          Plot(x,y,RGB(Red,Green,Blue)) 
          StopDrawing() 
        Next 
      Next 
    EndIf 
  EndIf 
  ProcedureReturn Image2 
EndProcedure 

Procedure DecryptImage(Image) 
  Image2 = 0 
  RedAdd = 25 
  GreenAdd = 128 
  BlueAdd = 212 
  
  If IsImage(Image) 
    Image2 = CreateImage(#PB_Any, ImageWidth(Image), ImageHeight(Image), ImageDepth(Image)) 
    If Image2 
      For x=0 To ImageWidth(Image)-1 
        For y=0 To ImageHeight(Image)-1 
          StartDrawing(ImageOutput(Image)) 
          Color = Point(x,y) 
          StopDrawing() 
          StartDrawing(ImageOutput(Image2)) 
          Red = Red(Color) ! RedAdd 
          Green = Green(Color) ! GreenAdd 
          Blue = Blue(Color) ! BlueAdd 
          
        
          Plot(x,y,RGB(Red,Green,Blue)) 
          StopDrawing() 
        Next 
      Next 
    EndIf 
  EndIf 
  ProcedureReturn Image2 
EndProcedure 

If LoadImage(0, "c:\image.bmp") 
  Image2 = CryptImage(0) 
  SaveImage(Image2, "c:\crypté.bmp") 
  Image3 = DecryptImage(Image2) 
  SaveImage(Image3, "c:\decrypté.bmp") 
EndIf
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Les procédés de cryptage par Xor ou inversion des bits sont trop connus, et détruisent complètement l'image; je ne vois pas trop l'intérêt :?
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

Message par tonton »

heu!! djes, ca détruit pas l' image... 8O arf!! c' est la Feria..j oubliai..

de plus il ne souhaite pas envoyer une image a "Ben Laden"
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Message par case »

ben on ne sait pas quel but poursuit lepiaf, comme il utilise le terme cryptage dans son programme j'en ai déduit que c'etait peut être pour rendre les images inexploitables sans les décrypter. et xor et l'inversion de bits sont des manières d'y arriver
ImageImage
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

tonton a écrit :heu!! djes, ca détruit pas l' image... 8O arf!! c' est la Feria..j oubliai..

de plus il ne souhaite pas envoyer une image a "Ben Laden"
Non, je sais, mais j'entends par là que l'image codée est brouillée.
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

incessante requête

Message par beauregard »

djes a écrit :l'image codée est brouillée.
c'est ce qui manque à pb... comme pour glbasic, un cryptage d'image avec un simple bouton dans l'ide... tant pis.
config de mon ordi: seven, directx11, Pentium(R) DualCore E5700, RadeonHD 4550 512MB, PureBasic 4.61 x86
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

..........
Dernière modification par Backup le sam. 01/oct./2011 13:06, modifié 2 fois.
Répondre