Pb d'images fantomes

JLC4 Messages postés 4 Date d'inscription mercredi 8 juin 2005 Statut Membre Dernière intervention 10 juin 2005 - 9 juin 2005 à 23:59
JLC4 Messages postés 4 Date d'inscription mercredi 8 juin 2005 Statut Membre Dernière intervention 10 juin 2005 - 10 juin 2005 à 11:30
Bonsoir,

J'applique une matrice de convolution à chacun des pixel d'une image *.bmp 24bits, et lorsque je recré une image avec les luminosités modifiées, j'obtiens une l'image, mais avec 2 autres images fantomes qui sont très nettement visible (en fait on dirai trois fois la même image, superposé et décalé).
Quelqu'un a déjà eu ce problème??

JLC

2 réponses

econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 24
10 juin 2005 à 10:19
Il suffit d'avoir un petit décalage dans le parcours de tes pixels
pour obtenir des résultats rigolos. Il faudrait que tu déposes ton code
ici pour qu'on puisse te dire ce qui ne va pas.






Manu
-------------------------------------------
Une question bien posée, c'est une chance de réponse bien adaptée.
0
JLC4 Messages postés 4 Date d'inscription mercredi 8 juin 2005 Statut Membre Dernière intervention 10 juin 2005
10 juin 2005 à 11:30
Je met le code (ya des chose inutiles, mais c'est parceque je ne met pas la totalité du code):


Dim tabImageSource(,,) As Byte



Dim tabImageModif(,,)
As
Byte



Dim tabLumSource(,)
As
Byte



Dim tabLumModif(,)
As
Integer



Dim tabIntro(53)
As
Byte



Dim fileNameSource
As
String



Dim fileNameModif
As
String = System.Environment.CurrentDirectory & "\ImageModif.bmp"



Dim test
As
Integer



Dim a, b, c, d, e, f, g, h, l, S
As
Single



Private
Sub MenuItem2_Click(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)
Handles MenuItem2.Click



'Menu "Ouvrir"


ouverture()



End
Sub



Private
Sub ouverture()



'C'est la procédure "gérant" l'ouverture de l'image source



'On ferme vide le contenu des deux picturebox:


fermerlesimages()



With dialogueOuvrir


.Title = "Ouverture de l'image source"


.Filter = "Fichiers bmp(*.bmp)|*.bmp"


dialogueOuvrir.ShowDialog()



End
With



End
Sub



Private
Sub dialogueOuvrir_FileOk_1(
ByVal sender
As System.Object,
ByVal e
As System.ComponentModel.CancelEventArgs)
Handles dialogueOuvrir.FileOk



'On enregistre le nom de l'image que l'on ouvre:


fileNameSource = dialogueOuvrir.FileName()



'On met à 1 la variable permettant de déterminer si il y a une image ouverte ou non:


test = 1



'On "libère" la picturebox1:



If
Not (pbSource.Image
Is
Nothing)
Then


pbSource.Image.Dispose()



End
If



'On lance la procédure permettant d'extraire les données de l'image et d'en faire un tableau:


remplissageTabSource()



'On remplit la picturebox1 avec l'image ouverte:


pbSource.Image = Image.FromFile(fileNameSource)



End
Sub



Private
Sub Button4_Click(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)
Handles Button4.Click



'Bouton "appliquer la matrice":



If test = 1
Then


procedureDeux()



End
If



End
Sub



Private
Sub procedureDeux()



'C'est la procédure "gérant" l'application de la matrice de convolution



'On extrait les coefficients de la matrice:


a = Val(TextBox2.Text)


b = Val(TextBox3.Text)


c = Val(TextBox4.Text)


d = Val(TextBox5.Text)


e = Val(TextBox6.Text)


f = Val(TextBox7.Text)


g = Val(TextBox8.Text)


h = Val(TextBox9.Text)


l = Val(TextBox10.Text)



'On en fait la somme:


S = a + b + c + d + e + f + g + h + l



'On verifie la condition nécessaire à l'application de la matrice:



If S = 0
Then



'En cas de problème, on affiche le message d'erreur:


MsgBox("La somme des coefficients de la matrice ne doit pas être nulle. Veuillez modifier les coefficients.")



Else



'Sinon on réinitialise la picturebox2:


reinitialiserLesPictureBoxes()



'On crée le fichier de l'image modifiée:


creeLeFichierModifDeux()



'On remplit la picturebox2 avec l'image modifiée (et l'image):


remplisLesPictureBoxes()



End
If



End
Sub



Private
Sub creeLeFichierModifDeux()



'C'est la procédure permettant de créer le tableau correspondant à l'image modifiée par l'application de la matrice de convolution



'On remplit le tableau composé des valeurs des luminosités:


remplissageDuTableauDesLuminosites()



'On crée et on remplit le tableau composé des variations de luminosités:


creerTabNouvellesLuminosites()



Dim i, j, k
As
Integer



Dim largeur
As
Integer = tabImageSource.GetLength(0)



Dim longueur
As
Integer = tabImageSource.GetLength(1)



'On redimensionne le tableau de l'image modifiée (on met du coup toutes les valeurs à 0):



ReDim tabImageModif(largeur - 1, longueur - 1, 2)



'On remplit ce tableau avec les nouvelles valeurs des luminosités:



For i = 0
To largeur - 1



For j = 0
To longueur - 1



For k = 0
To 2



If tabImageSource(i, j, k) + tabLumModif(i, j) <= 0
Then


tabImageModif(i, j, k) = 0



ElseIf tabImageSource(i, j, k) + tabLumModif(i, j) >= 255
Then


tabImageModif(i, j, k) = 255



Else


tabImageModif(i, j, k) = tabImageSource(i, j, k) + tabLumModif(i, j)



End
If



Next



Next



Next



'On crée le fichier de l'image modifiée:


ecriturefichier(fileNameModif, tabImageModif)



End
Sub



Private
Sub remplissageDuTableauDesLuminosites()



'C'est la procédure permettant d'extraire la luminosité de chaque pixel, et de la stocker dans un tableau



Dim largeur
As
Integer = tabImageSource.GetLength(0)



Dim longueur
As
Integer = tabImageSource.GetLength(1)



Dim i, j, k
As
Integer



'On redimmensionne le tableau des luminosités (toutes les valeurs sont mises égales à 0)



ReDim tabLumSource(largeur + 1, longueur + 1)



'On remplit le tableau avec la luminosité de chaque pixel:



For i = 0
To largeur - 1



For j = 0
To longueur - 1


tabLumSource(i + 1, j + 1) = tabImageSource(i, j, 0) / 3 + tabImageSource(i, j, 1) / 3 + tabImageSource(i, j, 2) / 3



Next



Next



End
Sub



Private
Sub creerTabNouvellesLuminosites()



'C'est la procédure permettant de créer et de remplir le tableau des variations de luminosités



Dim largeur
As
Integer = tabImageSource.GetLength(0)



Dim longueur
As
Integer = tabImageSource.GetLength(1)



Dim i, j
As
Integer



'On redimmensionne le tableau des variations de luminosités (toutes les valeurs sont mises égales à 0):



ReDim tabLumModif(largeur - 1, longueur - 1)



'On applique la matrice de convolution à chaque pixel, et on enregistre ces valeurs dans le tableau des variations de luminosités:



For i = 1
To largeur



For j = 1
To longueur


tabLumModif(i - 1, j - 1) = (-tabLumSource(i, j)) + tabLumSource(i - 1, j - 1) * a / S + tabLumSource(i, j - 1) * b / S + tabLumSource(i + 1, j - 1) * c / S + tabLumSource(i - 1, j) * d / S + tabLumSource(i, j) * e / S + tabLumSource(i + 1, j) * f / S + tabLumSource(i - 1, j + 1) * g / S + tabLumSource(i, j + 1) * h / S + tabLumSource(i + 1, j + 1) * l / S



Next



Next



End
Sub



Private
Sub reinitialiserLesPictureBoxes()



'Procédure permettant de réinitialiser la picturebox2:



If
Not (pbModif.Image
Is
Nothing)
Then


pbModif.Image.Dispose()



End
If



End
Sub



Private
Sub remplisLesPictureBoxes()



'Procédure permettant de remplir la picturebox2 avec l'image modifiée:


pbModif.Image = Image.FromFile(fileNameModif)



End
Sub



Private
Sub remplissageTabSource()



'C'est la procédure permettant de remplir le tableau composé de l'image ouverte (image source)



Dim myfileStream
As
New FileStream(fileNameSource, FileMode.Open, FileAccess.Read)



Dim mybinaryreader
As
New BinaryReader(myfileStream)



Dim i, j, k
As
Integer



'On commence par extraire les bits de descritpion de l'image:



For i = 0
To 53


tabIntro(i) = mybinaryreader.ReadByte



Next



'On extrait la longueur et la largeur de l'image ouverte:



Dim longueur
As
Integer = tabIntro(23) * 16 ^ 2 + tabIntro(22)



Dim largeur
As
Integer = tabIntro(19) * 16 ^ 2 + tabIntro(18)



'On redimensionne le tableau de l'image ouverte à la meme taille que l'image elle même:



ReDim tabImageSource(largeur - 1, longueur - 1, 2)



'On remplit le tableau de l'image ouverte avec la valeur RVB de chaque pixel:



For i = 0
To largeur - 1



For j = 0
To longueur - 1



For k = 0
To 2


tabImageSource(i, j, k) = mybinaryreader.ReadByte



Next



Next



Next


mybinaryreader.Close()


myfileStream.Close()



End
Sub



Private
Sub ecriturefichier(
ByVal filename
As
String,
ByVal tab
As
Byte(,,))



'C'est la procédure permettant d'écrire le fichier de l'image modifiée



Dim i, j, k
As
Integer



Dim myFileStream
As
New FileStream(filename, FileMode.Create)



Dim myBinaryWriter
As
New BinaryWriter(myFileStream)



'On écrit les bits de descritpion de l'image modifiée (les même que ceux de l'image ouverte):



For i = 0
To tabIntro.GetLength(0) - 1


myBinaryWriter.Write(tabIntro(i))



Next



'On ecrit les bits relatifs aux pixels de l'image modifiée:



For i = 0
To tab.GetLength(0) - 1



For j = 0
To tab.GetLength(1) - 1



For k = 0
To tab.GetLength(2) - 1


myBinaryWriter.Write(tab(i, j, k))



Next



Next



Next


myBinaryWriter.Close()


myFileStream.Close()



End
Sub



Private
Sub fermerlesimages()



'C'est la procédure permettant de vider le contenu des deux picturebox, et d'indiquer qu'il n'y a plus d'image chargé:


pbSource.Image =
Nothing


pbModif.Image =
Nothing


test = 0



End
Sub


End Class
0
Rejoignez-nous