Additive Noise / MultiplicativeNoise créés mais uniquement le SET du additive à suivre...
This commit is contained in:
parent
c92de13e29
commit
9ae2fdf8f4
302
code/Noise.py
302
code/Noise.py
|
@ -92,95 +92,245 @@ class Noise:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def getShapeRecursive(self, coords, pixelMap, pixelList ): # return PixelList
|
|
||||||
# coords = [lastx, lasty, x, y]
|
|
||||||
width = len( pixelMap[0] )
|
|
||||||
height = len( pixelMap )
|
|
||||||
|
|
||||||
lastx = coords[0]
|
|
||||||
lasty = coords[1]
|
|
||||||
x = coords[2]
|
|
||||||
y = coords[3]
|
|
||||||
|
|
||||||
newCoords = [x, y]
|
|
||||||
|
|
||||||
|
|
||||||
# si le pixel existe (pas de dépassement de la pixelMap)
|
|
||||||
if x<width and x>=0 and y<height and y>=0:
|
|
||||||
|
|
||||||
already = False;
|
|
||||||
for i in range(0, len(pixelList)):
|
|
||||||
if pixelList[i] == pixelMap[y][x]:
|
|
||||||
already = True;
|
|
||||||
break
|
|
||||||
|
|
||||||
# si le pixel n'est pas déjà dans le tableau
|
|
||||||
if not already:
|
|
||||||
|
|
||||||
pixelMap[y][x].setRGB(255,0,0);
|
|
||||||
|
|
||||||
# si trop de différence
|
|
||||||
lastP = pixelMap[lasty][lastx]
|
|
||||||
pix = pixelMap[y][x]
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if abs(lastP.r-pix.r) <= 50 and abs(lastP.g-pix.g) <= 50 and abs(lastP.b-pix.b) <= 50:
|
|
||||||
|
|
||||||
pixelList.append( pixelMap[y][x] ) # ajout au tableau
|
|
||||||
|
|
||||||
self.getShapeRecursive( [x, y, x-1, y+1], pixelMap, pixelList) # 1
|
|
||||||
self.getShapeRecursive( [x, y, x, y+1], pixelMap, pixelList) # 2
|
|
||||||
self.getShapeRecursive( [x, y, x+1, y+1], pixelMap, pixelList) # 3
|
|
||||||
|
|
||||||
self.getShapeRecursive( [x, y, x-1, y ], pixelMap, pixelList) # 4
|
|
||||||
# current pixel
|
|
||||||
self.getShapeRecursive( [x, y, x+1, y ], pixelMap, pixelList) # 6
|
|
||||||
|
|
||||||
self.getShapeRecursive( [x, y, x-1, y-1], pixelMap, pixelList) # 7
|
|
||||||
self.getShapeRecursive( [x, y, x, y-1], pixelMap, pixelList) # 8
|
|
||||||
self.getShapeRecursive( [x, y, x+1, y-1], pixelMap, pixelList) # 9
|
|
||||||
|
|
||||||
|
|
||||||
def getShape(self, coords, pixelMap, pixelList):
|
|
||||||
# coords = [lastx, lasty, x, y]
|
|
||||||
width = len( pixelMap[0] )
|
|
||||||
height = len( pixelMap )
|
|
||||||
|
|
||||||
lastx = coords[0]
|
|
||||||
lasty = coords[1]
|
|
||||||
x = coords[2]
|
|
||||||
y = coords[3]
|
|
||||||
|
|
||||||
if x<width and x>=0 and y<height and y>=0:
|
|
||||||
|
|
||||||
already = False;
|
|
||||||
for pix in pixelList:
|
|
||||||
if pix == pixelMap[y][x]:
|
|
||||||
already = True;
|
|
||||||
break
|
|
||||||
|
|
||||||
# si le pixel n'est pas déjà dans le tableau
|
|
||||||
if not already:
|
|
||||||
|
|
||||||
# si trop de différence
|
|
||||||
lastP = pixelMap[lasty][lastx]
|
|
||||||
pix = pixelMap[y][x]
|
|
||||||
|
|
||||||
if abs(lastP.r-pix.r) <= 50 and abs(lastP.g-pix.g) <= 50 and abs(lastP.b-pix.b) <= 50:
|
|
||||||
|
|
||||||
return pixelMap[y][x];
|
|
||||||
|
|
||||||
# self.getShape( [x, y, x-1, y+1], pixelMap, pixelList) # 1
|
|
||||||
# self.getShape( [x, y, x, y+1], pixelMap, pixelList) # 2
|
|
||||||
# self.getShape( [x, y, x+1, y+1], pixelMap, pixelList) # 3
|
|
||||||
|
|
||||||
# self.getShape( [x, y, x-1, y ], pixelMap, pixelList) # 4
|
|
||||||
# # current pixel
|
|
||||||
# self.getShape( [x, y, x+1, y ], pixelMap, pixelList) # 6
|
|
||||||
|
|
||||||
# self.getShape( [x, y, x-1, y-1], pixelMap, pixelList) # 7
|
|
||||||
# self.getShape( [x, y, x, y-1], pixelMap, pixelList) # 8
|
|
||||||
# self.getShape( [x, y, x+1, y-1], pixelMap, pixelList) # 9
|
|
||||||
|
|
||||||
return None # return none si le pixel n'est plus de la forme
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def AdditiveNoise_set(self, pixelMap, seuil=10):
|
||||||
|
seuil = float(seuil);
|
||||||
|
|
||||||
|
while seuil >= 1:
|
||||||
|
seuil /= 100.0
|
||||||
|
|
||||||
|
nbPixel = int( len(pixelMap) * len(pixelMap[0]) * seuil )
|
||||||
|
|
||||||
|
for bruit in range(0, nbPixel ):
|
||||||
|
x = random.randint(0, len(pixelMap[0]) - 1 )
|
||||||
|
y = random.randint(0, len(pixelMap) - 1 )
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if random.randint(0,1) == 1:
|
||||||
|
maxColor = max(pixelMap[y][x].r, pixelMap[y][x].g, pixelMap[y][x].b)
|
||||||
|
randomAdd = random.randint(0, (255-maxColor) / 10 )
|
||||||
|
else:
|
||||||
|
minColor = min(pixelMap[y][x].r, pixelMap[y][x].g, pixelMap[y][x].b)
|
||||||
|
randomAdd = - random.randint(0, minColor / 10 )
|
||||||
|
|
||||||
|
pixelMap[y][x].setRGB(
|
||||||
|
pixelMap[y][x].r + randomAdd,
|
||||||
|
pixelMap[y][x].g + randomAdd,
|
||||||
|
pixelMap[y][x].b + randomAdd
|
||||||
|
);
|
||||||
|
|
||||||
|
def AdditiveNoise_unset(self, pixelMap, seuil=5):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def MultiplicativeNoise_set(self, pixelMap, seuil=10):
|
||||||
|
seuil = float(seuil);
|
||||||
|
|
||||||
|
while seuil >= 1:
|
||||||
|
seuil /= 100.0
|
||||||
|
|
||||||
|
nbPixel = int( len(pixelMap) * len(pixelMap[0]) * seuil )
|
||||||
|
|
||||||
|
for bruit in range(0, nbPixel ):
|
||||||
|
x = random.randint(0, len(pixelMap[0]) - 1 )
|
||||||
|
y = random.randint(0, len(pixelMap) - 1 )
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if random.randint(0,1) == 1:
|
||||||
|
maxColor = max(pixelMap[y][x].r, pixelMap[y][x].g, pixelMap[y][x].b)
|
||||||
|
randomAdd = random.randint(0, (255-maxColor) / 10 )
|
||||||
|
else:
|
||||||
|
minColor = min(pixelMap[y][x].r, pixelMap[y][x].g, pixelMap[y][x].b)
|
||||||
|
randomAdd = - random.randint(0, minColor / 10 )
|
||||||
|
|
||||||
|
pixelMap[y][x].setRGB(
|
||||||
|
pixelMap[y][x].r + randomAdd,
|
||||||
|
pixelMap[y][x].g + randomAdd,
|
||||||
|
pixelMap[y][x].b + randomAdd
|
||||||
|
);
|
||||||
|
|
||||||
|
def MultiplicativeNoise_unset(self, pixelMap, seuil=5):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def ColorNoise_set(self, pixelMap, seuil=10):
|
||||||
|
seuil = float(seuil);
|
||||||
|
|
||||||
|
while seuil >= 1:
|
||||||
|
seuil /= 100.0
|
||||||
|
|
||||||
|
nbPixel = int( len(pixelMap) * len(pixelMap[0]) * seuil )
|
||||||
|
|
||||||
|
for bruit in range(0, nbPixel ):
|
||||||
|
x = random.randint(0, len(pixelMap[0]) - 1 )
|
||||||
|
y = random.randint(0, len(pixelMap) - 1 )
|
||||||
|
|
||||||
|
pixelMap[y][x].setRGB(
|
||||||
|
pixelMap[y][x].r + random.randint(0, (255-pixelMap[y][x].r)/4),
|
||||||
|
pixelMap[y][x].g + random.randint(0, (255-pixelMap[y][x].g)/4),
|
||||||
|
pixelMap[y][x].b + random.randint(0, (255-pixelMap[y][x].b)/4)
|
||||||
|
);
|
||||||
|
|
||||||
|
def ColorNoise_unset(self, pixelMap, seuil=5):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def Gaussian_set(self, pixelMap, seuil=10):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def Gaussian_unset(self, pixelMap, seuil=5):
|
||||||
|
pass
|
|
@ -67,3 +67,126 @@ def getShape(self, coords, pixelMap, pixelList ): # return PixelList
|
||||||
self.getShape(newCoords+[x-1, y-1], pixelMap, pixelList) # 7
|
self.getShape(newCoords+[x-1, y-1], pixelMap, pixelList) # 7
|
||||||
self.getShape(newCoords+[x, y-1], pixelMap, pixelList) # 8
|
self.getShape(newCoords+[x, y-1], pixelMap, pixelList) # 8
|
||||||
self.getShape(newCoords+[x+1, y-1], pixelMap, pixelList) # 9
|
self.getShape(newCoords+[x+1, y-1], pixelMap, pixelList) # 9
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def getShapeRecursive(self, coords, pixelMap, pixelList ): # return PixelList
|
||||||
|
# coords = [lastx, lasty, x, y]
|
||||||
|
width = len( pixelMap[0] )
|
||||||
|
height = len( pixelMap )
|
||||||
|
|
||||||
|
lastx = coords[0]
|
||||||
|
lasty = coords[1]
|
||||||
|
x = coords[2]
|
||||||
|
y = coords[3]
|
||||||
|
|
||||||
|
newCoords = [x, y]
|
||||||
|
|
||||||
|
|
||||||
|
# si le pixel existe (pas de dépassement de la pixelMap)
|
||||||
|
if x<width and x>=0 and y<height and y>=0:
|
||||||
|
|
||||||
|
already = False;
|
||||||
|
for i in range(0, len(pixelList)):
|
||||||
|
if pixelList[i] == pixelMap[y][x]:
|
||||||
|
already = True;
|
||||||
|
break
|
||||||
|
|
||||||
|
# si le pixel n'est pas déjà dans le tableau
|
||||||
|
if not already:
|
||||||
|
|
||||||
|
pixelMap[y][x].setRGB(255,0,0);
|
||||||
|
|
||||||
|
# si trop de différence
|
||||||
|
lastP = pixelMap[lasty][lastx]
|
||||||
|
pix = pixelMap[y][x]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if abs(lastP.r-pix.r) <= 50 and abs(lastP.g-pix.g) <= 50 and abs(lastP.b-pix.b) <= 50:
|
||||||
|
|
||||||
|
pixelList.append( pixelMap[y][x] ) # ajout au tableau
|
||||||
|
|
||||||
|
self.getShapeRecursive( [x, y, x-1, y+1], pixelMap, pixelList) # 1
|
||||||
|
self.getShapeRecursive( [x, y, x, y+1], pixelMap, pixelList) # 2
|
||||||
|
self.getShapeRecursive( [x, y, x+1, y+1], pixelMap, pixelList) # 3
|
||||||
|
|
||||||
|
self.getShapeRecursive( [x, y, x-1, y ], pixelMap, pixelList) # 4
|
||||||
|
# current pixel
|
||||||
|
self.getShapeRecursive( [x, y, x+1, y ], pixelMap, pixelList) # 6
|
||||||
|
|
||||||
|
self.getShapeRecursive( [x, y, x-1, y-1], pixelMap, pixelList) # 7
|
||||||
|
self.getShapeRecursive( [x, y, x, y-1], pixelMap, pixelList) # 8
|
||||||
|
self.getShapeRecursive( [x, y, x+1, y-1], pixelMap, pixelList) # 9
|
||||||
|
|
||||||
|
|
||||||
|
def getShape(self, coords, pixelMap, pixelList):
|
||||||
|
# coords = [lastx, lasty, x, y]
|
||||||
|
width = len( pixelMap[0] )
|
||||||
|
height = len( pixelMap )
|
||||||
|
|
||||||
|
lastx = coords[0]
|
||||||
|
lasty = coords[1]
|
||||||
|
x = coords[2]
|
||||||
|
y = coords[3]
|
||||||
|
|
||||||
|
if x<width and x>=0 and y<height and y>=0:
|
||||||
|
|
||||||
|
already = False;
|
||||||
|
for pix in pixelList:
|
||||||
|
if pix == pixelMap[y][x]:
|
||||||
|
already = True;
|
||||||
|
break
|
||||||
|
|
||||||
|
# si le pixel n'est pas déjà dans le tableau
|
||||||
|
if not already:
|
||||||
|
|
||||||
|
# si trop de différence
|
||||||
|
lastP = pixelMap[lasty][lastx]
|
||||||
|
pix = pixelMap[y][x]
|
||||||
|
|
||||||
|
if abs(lastP.r-pix.r) <= 50 and abs(lastP.g-pix.g) <= 50 and abs(lastP.b-pix.b) <= 50:
|
||||||
|
|
||||||
|
return pixelMap[y][x];
|
||||||
|
|
||||||
|
# self.getShape( [x, y, x-1, y+1], pixelMap, pixelList) # 1
|
||||||
|
# self.getShape( [x, y, x, y+1], pixelMap, pixelList) # 2
|
||||||
|
# self.getShape( [x, y, x+1, y+1], pixelMap, pixelList) # 3
|
||||||
|
|
||||||
|
# self.getShape( [x, y, x-1, y ], pixelMap, pixelList) # 4
|
||||||
|
# # current pixel
|
||||||
|
# self.getShape( [x, y, x+1, y ], pixelMap, pixelList) # 6
|
||||||
|
|
||||||
|
# self.getShape( [x, y, x-1, y-1], pixelMap, pixelList) # 7
|
||||||
|
# self.getShape( [x, y, x, y-1], pixelMap, pixelList) # 8
|
||||||
|
# self.getShape( [x, y, x+1, y-1], pixelMap, pixelList) # 9
|
||||||
|
|
||||||
|
return None # return none si le pixel n'est plus de la forme
|
65
code/bmp.py
65
code/bmp.py
|
@ -135,6 +135,70 @@ def testSaltAndPepper():
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def testAdditiveNoise():
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
# Parsing
|
||||||
|
print "Parsing file -",; t.reset();
|
||||||
|
img.parse( binFile );
|
||||||
|
print "Done in %s s" % (t.get())
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
print "Creating Additive -",; t.reset();
|
||||||
|
noise.AdditiveNoise_set(img.content.map, seuil=50)
|
||||||
|
print "Done in %s s" % (t.get())
|
||||||
|
|
||||||
|
# Unparsing
|
||||||
|
print "Unparsing file -",; t.reset();
|
||||||
|
img.unparse()
|
||||||
|
print "Done in %s s" % (t.get())
|
||||||
|
|
||||||
|
# image to stdout
|
||||||
|
print "Writing file -",; t.reset();
|
||||||
|
img.write( "AdditiveNoise.bmp" )
|
||||||
|
print "Done in %s s" % (t.get())
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
print "Removing Additive -",; t.reset();
|
||||||
|
noise.AdditiveNoise_unset(img.content.map)
|
||||||
|
print "Done in %s s" % (t.get())
|
||||||
|
|
||||||
|
# Unparsing
|
||||||
|
print "Unparsing file -",; t.reset();
|
||||||
|
img.unparse()
|
||||||
|
print "Done in %s s" % (t.get())
|
||||||
|
|
||||||
|
# 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()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def printIntPalette():
|
def printIntPalette():
|
||||||
img = BMPFile();
|
img = BMPFile();
|
||||||
|
|
||||||
|
@ -348,6 +412,7 @@ def mergeImages():
|
||||||
############ TESTS ############
|
############ TESTS ############
|
||||||
# testManualCreation()
|
# testManualCreation()
|
||||||
testSaltAndPepper()
|
testSaltAndPepper()
|
||||||
|
# testAdditiveNoise()
|
||||||
# testFileIntegrity()
|
# testFileIntegrity()
|
||||||
# printIntPalette()
|
# printIntPalette()
|
||||||
printImageQuality()
|
printImageQuality()
|
||||||
|
|
Loading…
Reference in New Issue