[Résolu] Comment lisser une image ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

[Résolu] Comment lisser une image ?

Message 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.
Dernière modification par Micoute le jeu. 20/sept./2012 15:07, modifié 1 fois.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Comment lisser une image ?

Message 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é .. :)
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Comment lisser une image ?

Message 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 
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Comment lisser une image ?

Message par Micoute »

Merci énormément, c'est tout à fait ça que je recherchais, à charge de revanche.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

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

Message 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
Est beau ce qui plaît sans concept :)
Speedy Galerie
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

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

Message par Micoute »

Je pense que c'est surement parce les pixels sont plus petits ! N'est-ce pas ?
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

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

Message 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é.
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

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

Message 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
Est beau ce qui plaît sans concept :)
Speedy Galerie
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

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

Message 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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

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

Message 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 :)
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

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

Message par Frenchy Pilou »

Je m'étais arreté à cela :oops: :)
voici déjà un lien sur L'anti aliasing
Est beau ce qui plaît sans concept :)
Speedy Galerie
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

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

Message 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 ;)
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

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

Message 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
Est beau ce qui plaît sans concept :)
Speedy Galerie
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

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

Message 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:
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

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

Message 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 )
Répondre