(EDIT (nouvelle version) : les nombreux 'startDrawing()' ralentissaient beaucoup trop...)
Code : Tout sélectionner
; (c) 2007 - Guillaume HUSSON
; Recherche des contours d'une image par la mèthode du filtre de Roberts
UsePNGImageDecoder()
UsePNGImageEncoder()
UseJPEGImageDecoder()
; Le filtre de Roberts :
Global Dim roberts.b(2,2)
; l'image à traiter :
#IMAGE = 0
nom_fichier$ = OpenFileRequester("Choisissez une image","","Image|*.BMP;*.bmp;*.png;*PNG;*.jpeg;*.jpg;*.JPEG;*.JPG",0)
If Not nom_fichier$
End
EndIf
LoadImage(#IMAGE,nom_fichier$)
Global width.l = ImageWidth(#IMAGE)
Global height.l = ImageHeight(#IMAGE)
Global Dim image_in.l(width,height)
StartDrawing(ImageOutput(#IMAGE))
For i.l=0 To width-1
For j.l=0 To height-1
image_in(i,j)=Point(i,j)
Next j
Next i
StopDrawing()
; l'image résultat :
Global Dim image_out.l(width,height)
MessageRequester("Début de la procédure de recherche de contours", "Cliquez sur OK puis patientez jusqu'à la fin de la recherche de contour.", #MB_OK|#MB_ICONINFORMATION)
Procedure.d convolution(i.l,j.l)
r.w = 0
g.w = 0
b.w = 0
For k.b = 0 To 2
For l.b = 0 To 2
If (i+k-1 < width And j+l-1 < height And i+k-1>=0 And j+l-1>=0)
c.l = image_in(i+k-1,j+l-1)
r + Red(c)*roberts(k,l)
g + Green(c)*roberts(k,l)
b + Blue(c)*roberts(k,l)
EndIf
Next l
Next k
r = Abs(r)
g = Abs(g)
b = Abs(b)
If(r>255)
r=255
EndIf
If(g>255)
g=255
EndIf
If(b>255)
b=255
EndIf
ProcedureReturn RGB(r,g,b)
EndProcedure
For i.l=0 To width-1
For j.l=0 To height-1
; initialisation : recherche des contours horizontaux, en premier lieu
roberts(0,0) = 0
roberts(0,1) = -1
roberts(1,0) = 1
roberts(1,1) = 0
convH.l = convolution(i,j)
; recherche des contours verticaux, en second
roberts(0,0) = -1
roberts(0,1) = 0
roberts(1,0) = 0
roberts(1,1) = 1
convV.l = convolution(i,j)
rH.w = Red(convH)
gH.w = Green(convH)
bH.w = Blue(convH)
rV.w = Red(convV)
gV.w = Green(convV)
bV.w = Blue(convV)
r.w = Int(Sqr(rH*rH+rV*rV))
g.w = Int(Sqr(gH*gH+gV*gV))
b.w = Int(Sqr(bH*bH+bV*bV))
If(r>255)
r=255
EndIf
If(g>255)
g=255
EndIf
If(b>255)
b=255
EndIf
image_out(i,j) = RGB(255,255,255)-RGB(r,g,b)
Next j
Next i
MessageRequester("Fin de la procédure de recherche de contours", "Vous pouvez maintenant sauvegarder votre nouvelle image ne contenant que les contours.", #MB_OK|#MB_ICONINFORMATION)
StartDrawing(ImageOutput(#IMAGE))
For i.l=0 To width-1
For j.l=0 To height-1
Plot(i,j,image_out(i,j))
Next j
Next i
StopDrawing()
nom_fichier$ = SaveFileRequester("Sauvegardez votre image","","Image PNG|*.png;*PNG",0)
If(nom_fichier$)
SaveImage(#IMAGE,nom_fichier$+".png",#PB_ImagePlugin_PNG)
EndIf
Un aperçu du résultat :
Avant :

Après :

EDIT : Un exemple plus parlant (quoique) et en couleur :
Avant :

Après :
