denoising.py/code/Convolution_Test.py

197 lines
3.4 KiB
Python
Raw Permalink Normal View History

2015-11-13 11:41:22 +00:00
# ~*~ Encoding: utf-8 ~*~ #
class RGBPixel:
def __init__(self, r, g, b, x, y):
self.r = r;
self.g = g;
self.b = b;
self.x = x;
self.y = y;
def setRGBPixel(self, r, g, b, x, y):
self.__init__(r, g, b, x, y);
def setRGB(self, r, g, b):
self.r = r;
self.g = g;
self.b = b;
def setXY(self, x, y):
self.x = x;
self.y = y;
def toString(self):
return 'rgb(%s, %s, %s)' % (self.r, self.g, self.b);
def toString_grayscale(self):
return (self.r+self.g+self.b) // 3;
def printRGBMatrix(m):
for line in m:
print '|',
for row in line:
print '%s |' % ( row.toString_grayscale() ),
print;
def printMatrix(m):
for line in m:
print '|',
for row in line:
print '%s |' % ( row ),
print;
# applique le filtre de "convolution" sur l'image #
###################################################
# @param pixelMap la matrice de pixels à modifier
#
# @history
# applique le filtre
def Convolution(pixelMap, kernel=None):
width = len( pixelMap[0] )
height = len( pixelMap )
if kernel == None:
print "no kernel given!"
exit()
# nb total résultant du kernel des valeurs positives
kernelFactor = 0;
for b in kernel:
for a in b:
if a > 0:
kernelFactor += a;
kMidWidth = len( kernel[0] ) // 2
kMidHeight = len( kernel ) // 2
# map de résultat (filtrée)
convolvedMap = []
# on parcourt tout les pixels
for y in range(0, height):
# on rajoute une ligne à la map filtrée
convolvedMap.append( [] )
for x in range(0, width):
pixel = pixelMap[y][x];
# on définit la matrice de même taille que le kernel mais correspondant aux pixels superposés
pixelM = [];
for b in range(-kMidHeight, 1+kMidHeight):
pixelM.append( [] );
for a in range(-kMidWidth, 1+kMidWidth):
# on met les valeurs entre 0 et longueur ou largeur pour pas récupérer les valeurs de l'autre côté (lissage bizarre)
ruledX = 0 if x+a<0 else width-1 if x+a>=width else x+a;
ruledY = 0 if y+b<0 else height-1 if y+b>=height else y+b;
if x+a<0 or x+a>=width or y+b<0 or y+b>=height: # si pixel dépasse de l'image, on l'ajoute pas
# on ajoute le pixel courant
pixelM[len(pixelM)-1].append( pixelMap[ruledY][ruledX] );
r,g,b = 0,0,0
# on effectue la convolution
for linePixelM, lineKernel in zip(pixelM, kernel):
for pix, fact in zip(linePixelM, lineKernel):
# pour chacun des filtres
r += pix.r * fact
g += pix.g * fact
b += pix.b * fact
print '(%s) * %s' % ( pix.r, fact );
print;
r = int(r/kernelFactor) % 256
g = int(g/kernelFactor) % 256
b = int(b/kernelFactor) % 256
# définition des couleurs sur la map filtrée
convolvedMap[y].append( RGBPixel(
r = r,
g = g,
b = b,
x = x,
y = y
) )
return convolvedMap
# on définit une matrice de base
pixelSample = [ RGBPixel(50, 50, 50, 0, 0),
RGBPixel(100, 100, 100, 0, 0) ];
# on définit la matrice 10x5
matrix50 = [];
for y in range(0,3):
matrix50.append( [] );
for x in range(0,3):
pixelSample[(x+y*3)%2].setXY(x, y);
matrix50[y].append( pixelSample[(x+y*5)%2] );
# on l'affiche
printRGBMatrix(matrix50);print;
# on définit le noyau 3x3
k = [ [1, 1, 1],
[1, 0, 1],
[1, 1, 1] ];
# on l'affiche
printMatrix(k);print;
matrix50Convolved = Convolution(matrix50, k);
printRGBMatrix(matrix50Convolved);print;
printRGBMatrix(matrix50);print;