Page 1 sur 3

[Résolu] Comment lisser une image ?

Publié : jeu. 20/sept./2012 11:51
par Micoute
Peut-être avez-vous la réponse ! Moi, je ne sais pas comment on fait, alors je fais appel aux hommes de bonne volonté pour m'aider à combler cette lacune.

Avec tous mes remerciements sincères.

Re: Comment lisser une image ?

Publié : jeu. 20/sept./2012 12:28
par Backup
voici deja un lien sur L'anti aliasing

http://www.purebasic.fr/french/viewtopi ... i+aliasing

mais en general , le lissage n'est que l'application d'un Filtre sur l'image
c'est a dire un petit calcul numerique sous forme de masque , qui entoure le pixel analysé .. :)

Re: Comment lisser une image ?

Publié : jeu. 20/sept./2012 13:04
par G-Rom
C'est très simple.

avec une double boucle imbriqué tu lis la couleur de chaque pixel.
avec une autre boucle tu lis les pixels voisin
tu additionnes les pixels adjacents
tu divises par le nombre de pixel adjacents
tu sauvegardes ton résultat.

voici un code plus parlant :

Code : Tout sélectionner

UsePNGImageDecoder()
UseJPEG2000ImageDecoder()
UseJPEGImageDecoder()
UseTGAImageDecoder()

; 10 passes
#BLUR_PASS = 2
#BLUR_SIZE = 2

image.s = OpenFileRequester("","","",0)

If image
LoadImage(0,image,24)

; Tableau de resultat
Dim colorResult.i(ImageWidth(0),ImageHeight(0))

;Lecture de l'image source
StartDrawing(ImageOutput(0))
For pass = 0 To #BLUR_PASS - 1
  
  For y = 0 To ImageHeight(0)-1
    For x = 0 To ImageWidth(0)-1
      
      ; Recup du pixel
      pixel.i = Point(x,y)
      
      ; Des couleurs
      rCol = Red(pixel)
      gCol = Green(pixel)
      bCol = Blue(pixel)
      
      ; On regarde autour du pixel , on compte les pixel valide (n) qui sont dans l'image xy>0 & xy<taille
      n=1
      For yy = -#BLUR_SIZE To #BLUR_SIZE
        For xx = -#BLUR_SIZE To #BLUR_SIZE
          
          If x+xx=>0 And x+xx<ImageWidth(0) And y+yy=>0 And y+yy<ImageHeight(0) And xx<>0 And yy<>0
            n+1
            col.i = Point(x+xx,y+yy) 
            
            ; on additionne par rapport au pixel precedent
            rCol + Red(col) 
            gCol + Green(col)
            bCol + Blue(col)

          EndIf 
                   
        Next
      Next 
      
      ; on divise le pixel par le nombre de pixel valide
      rCol / n 
      gCol / n
      bCol / n
      
      ; on verifie que la couleur ne dépasse pas 0-255
      If rCol > 255 : rCol = 255 : EndIf
      If gCol > 255 : gCol = 255 : EndIf
      If bCol > 255 : bCol = 255 : EndIf
      
      If rCol < 0 : rCol = 0 : EndIf
      If gCol < 0 : gCol = 0 : EndIf
      If bCol < 0 : bCol = 0 : EndIf
                     
      pixel = RGB(rCol,gCol,bCol)
      
      ; on colle le resultat dans le tableau
      colorResult(x,y) = pixel
      
    Next
  Next 
  
  ; on met à jour l'image source pour la passe suivante.
  For ny = 0 To ImageHeight(0)-1
    For nx = 0 To ImageWidth(0)-1
        Plot(nx,ny,colorResult(nx,ny)) 
    Next
  Next
  
    
Next ; passe suivante

; on sauvegarde le resultat dans un .bmp
  StopDrawing()
  
  CreateImage(1,ImageWidth(0),ImageHeight(0))
  StartDrawing(ImageOutput(1))
    For y = 0 To ImageHeight(1)-1
      For x = 0 To ImageWidth(1)-1
        Plot(x,y,colorResult(x,y)) 
      Next
    Next
  StopDrawing()
  
  file.s = SaveFileRequester("","","*.bmp",0)
  If file
    SaveImage(1,file,#PB_ImagePlugin_BMP)
  EndIf 
  
  
EndIf 

Re: Comment lisser une image ?

Publié : jeu. 20/sept./2012 15:07
par Micoute
Merci énormément, c'est tout à fait ça que je recherchais, à charge de revanche.

Re: [Résolu] Comment lisser une image ?

Publié : jeu. 20/sept./2012 16:19
par Frenchy Pilou
Sinon il y a un autre genre de lissage automatique
simplement diviser la taille de l'image par deux!

Cela suppose bien sûr de l'avoir au double ou plus au départ

Re: [Résolu] Comment lisser une image ?

Publié : jeu. 20/sept./2012 17:06
par Micoute
Je pense que c'est surement parce les pixels sont plus petits ! N'est-ce pas ?

Re: [Résolu] Comment lisser une image ?

Publié : jeu. 20/sept./2012 17:18
par G-Rom
Frenchy Pilou a écrit :Sinon il y a un autre genre de lissage automatique
simplement diviser la taille de l'image par deux!

Cela suppose bien sûr de l'avoir au double ou plus au départ
?

si j'ai une image de 1024x768 est que je la divise en deux , j'aurais la même image en 512x384 sans "lissage"
il faudrait à la rigueur la ré-agrandir , mais ce ne serais pas du lissage, mais de la perte pure de qualité.

Re: [Résolu] Comment lisser une image ?

Publié : jeu. 20/sept./2012 17:53
par Frenchy Pilou
Par exemple en illustration on travaille directement au double de valeur finale souhaitée
donc on est déjà net
A la division par deux les effets d'escalier (s'il y en avait encore ) disparaissent d'un facteur 2 de fait
C'est une méthode de boucher, j'en conviens :)

Image

Re: [Résolu] Comment lisser une image ?

Publié : jeu. 20/sept./2012 17:59
par G-Rom
on ne parle pas d'aliasing , mais de blur, c'est pas pareil ;)

Image générée via le code plus haut, 2 passes, taille 5 :

Image

Re: [Résolu] Comment lisser une image ?

Publié : jeu. 20/sept./2012 18:04
par Backup
non Frenchy , pour le coup tu te plante là :)

comme le Dis G-rom , le fait de reduire la resolution ne fait Que perdre des Pixels...rien de plus

en plus ton exempl n'est pas bonpour 2 raisons !

1- tu utilise surement un logiciel pour reduire la resolution de l'image , il est fort probable qu'il colle un algo de lissage sans que tu sois au courant
2- tu utilise le format Jpg , qui de toute façon applique un lissage !


j'ai travaillé pas mal de temps dans l'imprimerie, et le probleme du changement de résolution etait a l'epoque de l'arrrivé des Mac dans les salles de montage un vrais probleme
ça sortait des images pouraves a imprimer :)

le principe du lissage a tres bien ete expliqué par G-rom

en clair sur 3 pixel

MMM MMM MMM

il faut faire la moyenne ce qui va donner :

MMM MMM MMM

le pixel du centre sert de lissage :)

Re: [Résolu] Comment lisser une image ?

Publié : jeu. 20/sept./2012 18:46
par Frenchy Pilou
Je m'étais arreté à cela :oops: :)
voici déjà un lien sur L'anti aliasing

Re: [Résolu] Comment lisser une image ?

Publié : jeu. 20/sept./2012 19:31
par G-Rom
ton truc pilou serait alors d'utiliser un filtre de sobel pour la détection de contour , puis via le même principe "smoothé" ce contour.
pour la 3D cela se fait au niveau de la rasterization , généralement les api s'en charge très bien ( opengl / directx )
Comme t'es un fragment du moteur google , je te laisse cherché sur le forum, j'avais posté un truc la dessus ;)

Re: [Résolu] Comment lisser une image ?

Publié : ven. 21/sept./2012 0:20
par Frenchy Pilou
Pour ma petite manipe de boucher, PureBasic utiliserait cela
ResizeImage()
Syntaxe
Resultat = ResizeImage(#Image, Largeur, Hauteur [, Mode])
Description
Redimensionne l'#Image conformément aux largeur et hauteur spécifiées (en pixels).

Le paramètre optionel 'Mode' peut prendre une des valeurs suivantes:
#PB_Image_Smooth: Redimensionne l'image avec interpolation (mode par défaut).

et si cela ne suffit pas on appliquerait alors vos descriptions pour "lisser" l'image :)

Mais le flou ou la profondeur de champ (pour faire réaliste) dans les images d'un point de vue artistique, il y a le pour et le contre :)
L'oeil ne voit pas du flou, ce brouillard vaporeux! :)
Un appareil photo oui ou tout du moins le fabrique :mrgreen:

Et plus on avance on âge plus on se rend compte que cette netteté naturelle manque dans la vie de tout les jours!
Que l'oeil s'use...et que sans le concours de lunettes...

Par exemple pour ces 2 images l'oeil va préférer la "nette" mais bon...les goûts... les couleurs :D
By Bio-designer avec la Shadowbox de ZBrush
Image
Image

Re: [Résolu] Comment lisser une image ?

Publié : ven. 21/sept./2012 7:57
par djes
Frenchy Pilou a écrit :Mais le flou ou la profondeur de champ (pour faire réaliste) dans les images d'un point de vue artistique, il y a le pour et le contre :)
L'oeil ne voit pas du flou, ce brouillard vaporeux! :)
Un appareil photo oui ou tout du moins le fabrique :mrgreen:

Et plus on avance on âge plus on se rend compte que cette netteté naturelle manque dans la vie de tout les jours!
Que l'oeil s'use...et que sans le concours de lunettes...

Par exemple pour ces 2 images l'oeil va préférer la "nette" mais bon...les goûts... les couleurs :D
By Bio-designer avec la Shadowbox de ZBrush
Image
Image
Késki raconte ??? :mrgreen:

Re: [Résolu] Comment lisser une image ?

Publié : ven. 21/sept./2012 12:52
par G-Rom

Code : Tout sélectionner

UseJPEGImageDecoder()
UseJPEGImageEncoder()


LoadImage(0,"double.jpg")

w = ImageWidth(0)
h = ImageHeight(0)

ResizeImage(0,w/2,h/2,#PB_Image_Smooth)
ResizeImage(0,w,h,#PB_Image_Smooth)

SaveImage(0,"butcher.jpg",#PB_ImagePlugin_JPEG)
Fait le test par toi même , c'est crado :D, il faudrait codé le filtre hq4x ( pilou , si tu ne sait pas quoi faire... :D )