diff --git a/code/BMPFile.py b/code/BMPFile.py index a0efd34..a9014d1 100644 --- a/code/BMPFile.py +++ b/code/BMPFile.py @@ -233,14 +233,16 @@ class BMPContent: headerHandler.colorNb = 0 headerHandler.colorINb = 0 + if newBpp in [1,4,8,24]: # si nouveau bpp défini + headerHandler.bpp = newBpp; + # valeurs calculées - headerHandler.padding = ( 4 - headerHandler.width*3 % 4 ) % 4 - headerHandler.size = headerHandler.width * headerHandler.height * headerHandler.bpp # taille de la map (hauteur*largeur* nombre d'octets par pixel) + headerHandler.padding = ( 4 - headerHandler.width*headerHandler.bpp/3 % 4 ) % 4 + headerHandler.size = headerHandler.width * headerHandler.height * headerHandler.bpp # taille de la map (hauteur*largeur* nombre d'octets par pixel) headerHandler.rowSize = headerHandler.size / headerHandler.height # taille réelle de ligne headerHandler.fileSize = headerHandler.offset + headerHandler.size # taille du fichier BMP = offset + taille map - if newBpp in [1,4,8,24]: # si nouveau bpp défini - headerHandler.bpp = newBpp; + self.binData = "" for line in self.map[::-1]: @@ -410,6 +412,7 @@ class BMPFile: if newBpp in [1,4,8,24]: # si nouveau bpp défini bpp = newBpp; + # on déparse les classes utilisées self.content.unparse( self.content.map, self.header, newBpp=bpp ) self.header.unparse() @@ -419,4 +422,10 @@ class BMPFile: self.intData = [] for byte in self.binData: - self.intData.append( ord(byte) ) \ No newline at end of file + self.intData.append( ord(byte) ) + + + # écrit l'image dans un fichier + def write(self, filename): + with open(filename,"w") as file: + file.write( self.binData ); \ No newline at end of file diff --git a/code/Noise.py b/code/Noise.py index 6789b68..438bc34 100644 --- a/code/Noise.py +++ b/code/Noise.py @@ -5,6 +5,7 @@ import random class Noise: + # ajout de bruit "poivre & sel" avec un seuil (% de l'image bruité) def SaltAndPepper_set(self, seuil, pixelMap): seuil = float(seuil); @@ -23,9 +24,56 @@ class Noise: pixelMap[y][x].setRGB(0,0,0); + # enlève le bruit "poivre et sel" + def SaltAndPepper_unset(self, pixelMap): + width = len( pixelMap[0] ) + height = len( pixelMap ) + seuil = int( .5 * 256 ); + for y in range(0, len(pixelMap)): + for x in range(0, len(pixelMap[y])): + pMoy = ( pixelMap[y][x].r + pixelMap[y][x].g + pixelMap[y][x].b ) / 3 + # traitement si couleur extreme + if pMoy >= 235 or pMoy <= 20: + xmin, ymin, xmax, ymap = x, y, x, y; + rMoy, gMoy, bMoy, count = 0.0, 0.0, 0.0, 0 # moyennes des couleurs + rInterval, gInterval, bInterval, rgbInterval = 0, 0, 0, 0 # décalage avec le pixel + + if y-1 > -1: + ymin = y-1 + if y+1 < height: + ymax = y+1 + if x-1 > -1: + xmin = x-1 + if x+1 < width: + xmax = x+1 + + for j in range(0, ymax-xmin): # on parcourt les pixels autour + for i in range(0, xmax-xmin): + # calcul de la moyenne autour du pixel + if i != x and j != y: + rMoy += pixelMap[j][i].r; + gMoy += pixelMap[j][i].g; + bMoy += pixelMap[j][i].b; + count += 1 + + if count > 0: + rMoy = int( rMoy / count ) + gMoy = int( gMoy / count ) + bMoy = int( bMoy / count ) + + rInterval = abs( pixelMap[y][x].r - rMoy ) + gInterval = abs( pixelMap[y][x].g - gMoy ) + bInterval = abs( pixelMap[y][x].b - bMoy ) + + rgbInterval = ( rInterval + gInterval + bInterval ) / 3 + + # si la couleur est trop "différente" alors on remplace sa couleur par la moyenne des couleurs alentours + if rgbInterval > seuil: + pixelMap[y][x].setRGB(rMoy, gMoy, bMoy); + diff --git a/code/SaltAndPepper/10_pct.bmp b/code/SaltAndPepper/10_pct.bmp new file mode 100644 index 0000000..e69de29 diff --git a/code/SaltAndPepper/10_unset.bmp b/code/SaltAndPepper/10_unset.bmp new file mode 100644 index 0000000..5be1436 --- /dev/null +++ b/code/SaltAndPepper/10_unset.bmp @@ -0,0 +1 @@ +Mauvais format (erreur de taille) diff --git a/code/SaltAndPepper/20_pct.bmp b/code/SaltAndPepper/20_pct.bmp new file mode 100644 index 0000000..5395c01 Binary files /dev/null and b/code/SaltAndPepper/20_pct.bmp differ diff --git a/code/SaltAndPepper/30_pct.bmp b/code/SaltAndPepper/30_pct.bmp new file mode 100644 index 0000000..1ae08d7 Binary files /dev/null and b/code/SaltAndPepper/30_pct.bmp differ diff --git a/code/bmp.py b/code/bmp.py index c8da8a6..3bb9bd3 100644 --- a/code/bmp.py +++ b/code/bmp.py @@ -8,38 +8,71 @@ from BMPFile import * from Noise import * import random import sys +import time +if len(sys.argv) < 3: + print "Require 2 args : \n* input image\n* output image" + exit() +class Timer: + def __init__(self): + self.timer = time.time(); + def reset(self): + self.timer = time.time(); + + def get(self): + return float(int(100*(time.time()-self.timer)))/100 def testFileIntegrity(): + + t = Timer(); + total = Timer(); total.reset(); + + # lecture du fichier + print "Reading Image -",; t.reset(); with open( sys.argv[1] ) as file: binFile = file.read() + print "Done in %s s" % (t.get()) + + + img = BMPFile(); # Instanciation du BMPFile + noise = Noise(); # Instanciation du NoiseObject - # Instanciation du BMPFile - img = BMPFile() - # Instanciation du NoiseObject - noise = Noise(); # Parsing + print "Parsing file -",; t.reset(); img.parse( binFile ); + print "Done in %s s" % (t.get()) + print "Creating random extreme pixels -",; t.reset(); noise.SaltAndPepper_set(10, img.content.map) + print "Done in %s s" % (t.get()) + print "Removing salt and pepper -",; t.reset(); + noise.SaltAndPepper_unset(img.content.map) + print "Done in %s s" % (t.get()) + # Unparsing + print "Unparsing file -",; t.reset(); img.unparse(newBpp=24) + print "Done in %s s" % (t.get()) - print img.binData + # image to stdout + print "Writing file -",; t.reset(); + img.write( sys.argv[2] ) + print "Done in %s s" % (t.get()) + print "\nExecution Time: %s seconds" % total.get() diff --git a/code/new.bmp b/code/new.bmp index aecf0ac..b98211e 100644 Binary files a/code/new.bmp and b/code/new.bmp differ