Poivre&Sel set, unset partiel (wtf?) et modification de l'affichage
This commit is contained in:
parent
bee34b1ea8
commit
999f8580ae
|
@ -233,14 +233,16 @@ class BMPContent:
|
||||||
headerHandler.colorNb = 0
|
headerHandler.colorNb = 0
|
||||||
headerHandler.colorINb = 0
|
headerHandler.colorINb = 0
|
||||||
|
|
||||||
|
if newBpp in [1,4,8,24]: # si nouveau bpp défini
|
||||||
|
headerHandler.bpp = newBpp;
|
||||||
|
|
||||||
# valeurs calculées
|
# valeurs calculées
|
||||||
headerHandler.padding = ( 4 - headerHandler.width*3 % 4 ) % 4
|
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.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.rowSize = headerHandler.size / headerHandler.height # taille réelle de ligne
|
||||||
headerHandler.fileSize = headerHandler.offset + headerHandler.size # taille du fichier BMP = offset + taille map
|
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 = ""
|
self.binData = ""
|
||||||
for line in self.map[::-1]:
|
for line in self.map[::-1]:
|
||||||
|
@ -410,6 +412,7 @@ class BMPFile:
|
||||||
if newBpp in [1,4,8,24]: # si nouveau bpp défini
|
if newBpp in [1,4,8,24]: # si nouveau bpp défini
|
||||||
bpp = newBpp;
|
bpp = newBpp;
|
||||||
|
|
||||||
|
|
||||||
# on déparse les classes utilisées
|
# on déparse les classes utilisées
|
||||||
self.content.unparse( self.content.map, self.header, newBpp=bpp )
|
self.content.unparse( self.content.map, self.header, newBpp=bpp )
|
||||||
self.header.unparse()
|
self.header.unparse()
|
||||||
|
@ -420,3 +423,9 @@ class BMPFile:
|
||||||
self.intData = []
|
self.intData = []
|
||||||
for byte in self.binData:
|
for byte in self.binData:
|
||||||
self.intData.append( ord(byte) )
|
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 );
|
|
@ -5,6 +5,7 @@ import random
|
||||||
class Noise:
|
class Noise:
|
||||||
|
|
||||||
|
|
||||||
|
# ajout de bruit "poivre & sel" avec un seuil (% de l'image bruité)
|
||||||
def SaltAndPepper_set(self, seuil, pixelMap):
|
def SaltAndPepper_set(self, seuil, pixelMap):
|
||||||
seuil = float(seuil);
|
seuil = float(seuil);
|
||||||
|
|
||||||
|
@ -23,8 +24,55 @@ class Noise:
|
||||||
pixelMap[y][x].setRGB(0,0,0);
|
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);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Mauvais format (erreur de taille)
|
Binary file not shown.
After Width: | Height: | Size: 768 KiB |
Binary file not shown.
After Width: | Height: | Size: 768 KiB |
43
code/bmp.py
43
code/bmp.py
|
@ -8,38 +8,71 @@ from BMPFile import *
|
||||||
from Noise import *
|
from Noise import *
|
||||||
import random
|
import random
|
||||||
import sys
|
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():
|
def testFileIntegrity():
|
||||||
|
|
||||||
|
t = Timer();
|
||||||
|
total = Timer(); total.reset();
|
||||||
|
|
||||||
|
|
||||||
# lecture du fichier
|
# lecture du fichier
|
||||||
|
print "Reading Image -",; t.reset();
|
||||||
with open( sys.argv[1] ) as file:
|
with open( sys.argv[1] ) as file:
|
||||||
binFile = file.read()
|
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
|
# Parsing
|
||||||
|
print "Parsing file -",; t.reset();
|
||||||
img.parse( binFile );
|
img.parse( binFile );
|
||||||
|
print "Done in %s s" % (t.get())
|
||||||
|
|
||||||
|
print "Creating random extreme pixels -",; t.reset();
|
||||||
noise.SaltAndPepper_set(10, img.content.map)
|
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
|
# Unparsing
|
||||||
|
print "Unparsing file -",; t.reset();
|
||||||
img.unparse(newBpp=24)
|
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()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
BIN
code/new.bmp
BIN
code/new.bmp
Binary file not shown.
Before Width: | Height: | Size: 768 KiB After Width: | Height: | Size: 768 KiB |
Loading…
Reference in New Issue