Etendre un mask (image) progressivement

Etendre un mask (image) progressivement - Python - Programmation

Marsh Posté le 06-03-2024 à 13:36:37    

Bonjour,
Je cherche un moyen d'étendre un mask (noir/blanc) mais de manière progressive (nuance de gris du blanc vers le noir) sur un nombre de pixels donné.
Voici un exemple (approximatif) :  
https://i.ibb.co/1JzVCvv/Sans-titre-2.png
 
L'idée est d'avoir une fonction en python qui prends l'image de gauche et qui calcule l'image de droite en lui donnant un nombre de pixel à etendre.
 
Je bloque sur ce problème depuis un moment et google ne m'aide guère :(

Reply

Marsh Posté le 06-03-2024 à 13:36:37   

Reply

Marsh Posté le 06-03-2024 à 16:54:57    

Bon, j'ai réussi à bricoler une implémentation qui donne un résultat satisfaisant mais c'est pas du tout optimisé car la fonction prends plus d'une seconde à s'exécuter sur une image de 768px :(

Code :
  1. def dilate_mask(mask, dilation_amt):
  2.     mask_out = mask.copy()
  3.     for i in range(dilation_amt):
  4.         x, y = np.meshgrid(np.arange(i + 1), np.arange(i + 1))
  5.         center = (i + 1) // 2
  6.         dilation_kernel = ((x - center)**2 + (y - center)**2 <= center**2).astype(np.uint8)
  7.         #dilation_kernel = np.ones((i+1, i+1))
  8.    
  9.         img_np_dilated = binary_dilation(mask, structure=dilation_kernel, iterations=2)
  10.         img_np_dilated_with_color = img_np_dilated * ((1 - (i / dilation_amt)) * 255)
  11.         img_np_dilated_mask = (mask_out == 0)
  12.        
  13.         mask_out[img_np_dilated_mask] = img_np_dilated_with_color[img_np_dilated_mask]
  14.     dilated_mask = Image.fromarray(mask_out.astype(np.uint8) * 255)
  15.     return dilated_mask, mask_out
  16.    
  17. def dilate_and_colorize(image_path, kernel_size):
  18.     img_np = np.array(Image.open(image_path).convert('L'))
  19.     img_np_dilated = dilate_mask(img_np, kernel_size)[1]
  20.    
  21.     return Image.fromarray(img_np_dilated)
  22.    
  23.    
  24. # Utilisation de la fonction
  25. image_path = "mask.png"
  26. kernel_size = 64  # Plus c'est grand, plus c'est long :(
  27. dilate_and_colorize(image_path, kernel_size).save("mask3.png" )

Reply

Marsh Posté le 06-03-2024 à 18:12:06    

Peut-être le terme que tu cherches c'est genre "filtre flou" / "flouter" / ... ?? :??:

Reply

Marsh Posté le 06-03-2024 à 18:18:11    

J'ai pensé au filtre gaussien (qui est très rapide).
Le soucis du flou, c'est qu'il prends la moyenne des pixels (sur une taille donnée). Hors moi je souhaite étendre la zone. Autrement dit, la partie blanche doit rester blanche et s'étendre progressivement vers le noir dans la partie noir.

Reply

Marsh Posté le 06-03-2024 à 19:10:57    

Ahhhh. Par contre ca m'a donné une idée :  
 
 
dilated = (input * dilatation binaire * (facteur * 2)))
output = (dilated * flou gaussien * facteur) | dilated


Message édité par azubal le 06-03-2024 à 20:13:07
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed