Modification inutile
This commit is contained in:
parent
a4ed14df35
commit
80fcbea44f
|
@ -1,224 +0,0 @@
|
|||
Classes:
|
||||
|
||||
BMPHeader
|
||||
/***************/
|
||||
/* ATTRIBUTS */
|
||||
/***************/
|
||||
|
||||
* CONTENU BRUT PARTIEL (54 premiers bytes)
|
||||
- <binData> header brut (binaire)
|
||||
- <intData> header format liste de (0-255)
|
||||
|
||||
* STRUCTURE DU HEADER
|
||||
- <signature> signature (4D42) par défaut
|
||||
- <fileSize> taille du fichier .bmp (bytes)
|
||||
4 bytes à 0
|
||||
- <offset> début du codage de l'image (bytes)
|
||||
- <infoSize> taille du INFO_HEADER
|
||||
- <width> longueur de l'image (pixels)
|
||||
- <height> hauteur de l'image (pixels)
|
||||
- <plans> nombre de plans (défaut: 1)
|
||||
- <bpp> nombre de bits par pixel (1,4,8,24)
|
||||
- <compType> type de compression (0=none, 1=RLE-8, 2=RLE-4)
|
||||
- <size> taille de l'image avec padding (bytes)
|
||||
- <horiRes> résolution horizontale (pixels)
|
||||
- <vertRes> résolution verticale (pixels)
|
||||
- <colorNb> nombre de couleurs de l'image (ou 0)
|
||||
- <colorINb> nombre de couleurs importantes de l'image (ou 0)
|
||||
|
||||
* VALEURS CALCULEES
|
||||
- <rowSize> taille réelle d'une ligne +padding (bytes)
|
||||
- <padding> taille du padding de fin de ligne (bytes)
|
||||
|
||||
/***************/
|
||||
/* METHODES */
|
||||
/***************/
|
||||
parse(binHeader=""):
|
||||
Définit les attributs à partir de <binData> ou de l'argument <binHeader> si défini
|
||||
|
||||
unparse():
|
||||
Définit <binData>, et <intData> à partir de tout les attributs de structure
|
||||
|
||||
|
||||
info(type=0):
|
||||
Affiche les informations du header au format humain
|
||||
<type> peut valoir 0 (valeur par défaut) pour afficher en nombre, ou 1 pour afficher en hexa
|
||||
|
||||
|
||||
toInt(bytes):
|
||||
Retourne les octets <bytes> sous forme d'entier
|
||||
|
||||
fromInt(value, size):
|
||||
Retourne une chaine de <size> bytes correspondant au binaire de value
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
BMPContent
|
||||
/***************/
|
||||
/* ATTRIBUTS */
|
||||
/***************/
|
||||
|
||||
* CONTENU BRUT
|
||||
- <binData> matrice de pixels brut (binaire)
|
||||
- <intData> matrice de pixels format liste de (0-255)
|
||||
|
||||
* CONTENU EXPLOITABLE
|
||||
- <map> matrice de pixels (instance of RGBPixel)
|
||||
|
||||
|
||||
/***************/
|
||||
/* METHODES */
|
||||
/***************/
|
||||
parse(binContent="", header):
|
||||
Définit les attributs à partir de <binData> ou de l'argument <binContent> si défini ainsi que du header
|
||||
|
||||
unparse(headerHandler=None):
|
||||
Définit <bin> à partir map et définit aussi l'objet <headerHandler> s'il est passé en paramètres
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
BMPFile
|
||||
/***************/
|
||||
/* ATTRIBUTS */
|
||||
/***************/
|
||||
* CONTENU PALETTE (fin du header jusqu'aux pixels)
|
||||
- <binPalette> palette format binaire (header à offset)
|
||||
- <intPalette> palette format list de (0-255)
|
||||
|
||||
* CONTENU BRUT
|
||||
- <binData> contenu complet brut (binaire)
|
||||
- <intData> contenu complet format liste de (0-255)
|
||||
|
||||
* CONTENU STRUCTURE
|
||||
- <header> objet de type <BMPHeader>
|
||||
- <content> objet de type <BMPContent>
|
||||
|
||||
|
||||
/***************/
|
||||
/* METHODES */
|
||||
/***************/
|
||||
parse(binFile=""):
|
||||
Définit les attributs à partir de <binData> ou de l'argument <binFile> si défini
|
||||
|
||||
unparse():
|
||||
Définit <binData> à partir des attributs <BMPHeader> et <BMPContent>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
RGBPixel
|
||||
/***************/
|
||||
/* ATTRIBUTS */
|
||||
/***************/
|
||||
- <r> byte rouge entre 0 et 255
|
||||
- <g> byte vert entre 0 et 255
|
||||
- <b> byte bleu entre 0 et 255
|
||||
|
||||
|
||||
/***************/
|
||||
/* METHODES */
|
||||
/***************/
|
||||
Constructeur(r, g, b):
|
||||
Définit les attributs
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#############
|
||||
## To Do ##
|
||||
#############
|
||||
[x] gestion de la palette (attribut au <parse>) définit par défaut au <unparse>
|
||||
[x] faire que le unparse du content créée le header
|
||||
[ ] prise en charge des formats 1, 4, et 8 bpp
|
||||
|
||||
|
||||
|
||||
#######################################################################
|
||||
####### RECHERCHE DE PRISE EN CHARGE DES DIFFERENTS FORMATS BPP #######
|
||||
#######################################################################
|
||||
PixelColor(r, g, b, bpp=24)
|
||||
<r>, <g>, <b> respectivement les composantes bleue, rouge, verte
|
||||
<bpp> correspond aux bpp
|
||||
|
||||
CAS BPP=1 (noir et blanc)
|
||||
(r+g+b)/3 >= 256 / 2
|
||||
|
||||
1 - blanc
|
||||
2 - noir
|
||||
|
||||
CAS BPP=4 (niveaux de gris)
|
||||
16 * ((r+g+b)/3) / 256
|
||||
|
||||
CAS BPP=8
|
||||
(r+g+b) / 3
|
||||
|
||||
class PixelColor(r, g, b, bpp=24):
|
||||
if bpp not in [1,4,8,24]:
|
||||
self.bpp = 24
|
||||
else:
|
||||
self.bpp = bpp
|
||||
|
||||
|
||||
self.r = r
|
||||
self.g = g
|
||||
self.b = b
|
||||
|
||||
|
||||
# gestion des différents bpp
|
||||
if bpp == 1:
|
||||
self.intColor = int( (r+g+b)/3 > 256/2 )
|
||||
self.binColor = chr( self.intColor )
|
||||
elif bpp == 4:
|
||||
self.intColor = int( 16 * ((r+g+b)/3) / 256 ) )
|
||||
self.binColor = chr( self.intColor )
|
||||
elif bpp == 8:
|
||||
self.intColor = int( (r+g+b) / 3 )
|
||||
self.binColor = chr( self.intColor )
|
||||
else:
|
||||
self.intColor = [r, g, b]
|
||||
self.binColor = chr(b) + chr(g) + chr(r)
|
||||
|
||||
|
||||
|
||||
#######################################################################
|
||||
####### RECHERCHE DE PARSAGE DES PIXELS DE DIFFERENTS BPPS #######
|
||||
#######################################################################
|
||||
ALGO:
|
||||
|
||||
|
||||
firstBit = int(i) + i%1.0; # retourne le rang du premier bit (pas byte)
|
||||
lastBit = firstBit + bpp/8.0
|
||||
|
||||
startByte = int( firstBit ) # ex: pour i =29, on a: 3 octets
|
||||
startBit = int( 8 * (firstBit-startByte) ) # et 5 bits
|
||||
|
||||
stopByte = int( lastBit )
|
||||
stopBit = int( 8 * (lastBit-stopByte) )
|
||||
|
||||
bytes = binData[startByte:stopByte+1]
|
||||
|
||||
intArray = [ ord(x) for x in bytes ]
|
||||
binArray = [ "0" + bin(x)[2:] for x in intArray ]
|
||||
binArray = [ "0"*(8-len(binArray[x])) + binArray[x] for x in range(0, len(binArray)) ]
|
||||
binary = ""
|
||||
for byte in binArray:
|
||||
binary += byte;
|
||||
|
||||
print binArray
|
||||
print "%s to %s => %s" % ( startBit, 8*(stopByte-startByte)+stopBit, binary[startBit:8*(stopByte-startByte) + stopBit] )
|
|
@ -1,192 +0,0 @@
|
|||
Classes:
|
||||
|
||||
|
||||
/******************/
|
||||
/** COLORIZATION **/
|
||||
/******************/
|
||||
Principe: colorer en modifiant les pixels (n&b) dans un ton (teinte) précisée
|
||||
|
||||
restitue la contraste mais recentre la couleur autour de la teinte
|
||||
/************ ALGO **************/
|
||||
i = 50 // incertitude
|
||||
t = RGBPixel(1,2,3) // teinte souhaitée
|
||||
p = RGBPixel(1,2,3) // couleur actuelle
|
||||
|
||||
/************ CODE **************/
|
||||
def colorize(pixel, tint):
|
||||
|
||||
|
||||
|
||||
|
||||
/*****************/
|
||||
/** SHAPIZATION **/
|
||||
/*****************/
|
||||
Principe: récupérer une forme par récurrence
|
||||
|
||||
Ajouter les 8 bits périphériques du pixel courant s'il existe et s'il a des couleurs pas trop éloignées des précédentes
|
||||
/************ ALGO **************/
|
||||
|
||||
/************ CODE **************/
|
||||
def getShape(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); # debug, tout rouge
|
||||
|
||||
pixelList.append( pixelMap[y][x] ) # ajout au tableau
|
||||
|
||||
self.getShape(newCoords+[x-1, y+1], pixelMap, pixelList) # 1
|
||||
self.getShape(newCoords+[x, y+1], pixelMap, pixelList) # 2
|
||||
self.getShape(newCoords+[x+1, y+1], pixelMap, pixelList) # 3
|
||||
|
||||
self.getShape(newCoords+[x-1, y], pixelMap, pixelList) # 4
|
||||
# current pixel
|
||||
self.getShape(newCoords+[x+1, y], pixelMap, pixelList) # 6
|
||||
|
||||
self.getShape(newCoords+[x-1, y-1], pixelMap, pixelList) # 7
|
||||
self.getShape(newCoords+[x, y-1], pixelMap, pixelList) # 8
|
||||
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
|
17
code/bmp.py
17
code/bmp.py
|
@ -41,14 +41,15 @@ print "+-------------------------+"
|
|||
print "| %s |" % exactLength("TESTS DE DIFFERENCES", 23, 0)
|
||||
print "| %s |" % exactLength("", 23, 0)
|
||||
print "| 5) %s |" % exactLength("Difference en %", 20, -1)
|
||||
print "| 6) %s |" % exactLength("Difference en image", 20, -1)
|
||||
print "| 7) %s |" % exactLength("Fusion d'images (+)", 20, -1)
|
||||
print "| 8) %s |" % exactLength("Fusion d'images (-)", 20, -1)
|
||||
print "| 6) %s |" % exactLength("Difference par P", 20, -1)
|
||||
print "| 7) %s |" % exactLength("Difference en image", 20, -1)
|
||||
print "| 8) %s |" % exactLength("Fusion d'images (+)", 20, -1)
|
||||
print "| 9) %s |" % exactLength("Fusion d'images (-)", 20, -1)
|
||||
print "+-------------------------+"
|
||||
print
|
||||
while True:
|
||||
action = int( raw_input("choix: ") )
|
||||
if action >= 0 and action <= 8:
|
||||
if action >= 0 and action <= 9:
|
||||
break;
|
||||
|
||||
print
|
||||
|
@ -71,10 +72,14 @@ elif action == 4:
|
|||
elif action == 5:
|
||||
printImageQuality() # compare 2 images et donne le pourcentage de ressemblance/différence
|
||||
elif action == 6:
|
||||
imageForImageQuality() # crée une image correspondant aux différences de 2 images
|
||||
print "not implemented yet"
|
||||
exit()
|
||||
printImageQualityByPower() # compare 2 images et donne le pourcentage de ressemblance/différence (utilisant la puissance)
|
||||
elif action == 7:
|
||||
mergeImagesAdditive() # crée une image étant la fusion (addition) de 2 images
|
||||
imageForImageQuality() # crée une image correspondant aux différences de 2 images
|
||||
elif action == 8:
|
||||
mergeImagesAdditive() # crée une image étant la fusion (addition) de 2 images
|
||||
elif action == 9:
|
||||
mergeImagesSubstractive() # crée une image étant la fusion (soustractive) de 2 images
|
||||
else:
|
||||
print "Error! aborting"
|
||||
|
|
|
@ -415,13 +415,17 @@ def printImageQuality():
|
|||
percentage = 100.0 * (totalCount-differenceCount) / totalCount
|
||||
percentage = int(100*percentage)/100.0
|
||||
print "%s |" % (t.get())
|
||||
print "+-------------------------+"
|
||||
print "+-------------------------+---------+"
|
||||
print "| Commun = %s | |" % exactLength( str(percentage)+"%", 10, -1 );
|
||||
print "| Difference = %s | |" % exactLength( str(100-percentage)+"%", 10, -1 );
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# Créé une image contenant la différence entre 2 images existantes #
|
||||
####################################################################
|
||||
# @sysarg 1 le fichier A
|
||||
|
|
Loading…
Reference in New Issue