denoising.py/code/utility/Shape.py

69 lines
1.9 KiB
Python

# ~*~ encoding: utf-8 ~*~ #
import random
import time
class Shape:
# récupère la forme complète autour du pixel donné #
####################################################
# @param originalPixel pixel de base
# @param pixelMap matrice de pixels
# @param seuil Ecart entre le pixel et ses alentours à partir duquel on considère un contour ou une continuité de la forme
#
# @return retourne la liste des pixels composant la forme (références)
#
def get(self, originalPixel, pixelMap, seuil=10):
width = len( pixelMap[0] )
height = len( pixelMap )
shape = [] # contiendra les pixels de la forme
waiting = [originalPixel] # contient les pixels à traiter
# on continue d'analyser tant qu'il y a des pixels à traiter
while len(waiting) > 0:
pixel = waiting[0]
# on ajoute le pixel à la forme
shape.append( pixel )
xm, xM = pixel.x, pixel.x # valeurs minimales et maximales de x autour du pixel
ym, yM = pixel.y, pixel.y # valeurs minimales et maximales de y autour du pixel
# si on est pas sur le bord gauche
if pixel.x > 0:
xm = pixel.x - 1
# si on est pas sur le bord droit
if pixel.x < width-1:
xM = pixel.x + 1
# si on est pas sur le bord haut
if pixel.y > 0:
ym = pixel.y - 1
# si on est pas sur le bord bas
if pixel.y < height-1:
yM = pixel.y + 1
# on parcourt les pixels alentours
for j in range(ym, yM+1):
for i in range(xm, xM+1):
currentP = pixelMap[j][i]
# si le pixel n'a pas une couleur trop éloignée du pixel central
if abs(pixel.r-currentP.r) <= seuil and abs(pixel.g-currentP.g) <= seuil and abs(pixel.b-currentP.b) <= seuil:
# on ajoute le pixel à la liste d'attente
if not( currentP in shape or currentP in waiting):
waiting.append( currentP )
# on retire le pixel de la liste d'attente
try:
waiting.remove( pixel )
except:
pass
return shape;