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

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 :

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
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
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
By Bio-designer avec la Shadowbox de ZBrush

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
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
By Bio-designer avec la Shadowbox de ZBrush

Késki raconte ???

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

, il faudrait codé le filtre hq4x ( pilou , si tu ne sait pas quoi faire...

)