azubal | 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 :
- def dilate_mask(mask, dilation_amt):
- mask_out = mask.copy()
- for i in range(dilation_amt):
- x, y = np.meshgrid(np.arange(i + 1), np.arange(i + 1))
- center = (i + 1) // 2
- dilation_kernel = ((x - center)**2 + (y - center)**2 <= center**2).astype(np.uint8)
- #dilation_kernel = np.ones((i+1, i+1))
-
- img_np_dilated = binary_dilation(mask, structure=dilation_kernel, iterations=2)
- img_np_dilated_with_color = img_np_dilated * ((1 - (i / dilation_amt)) * 255)
- img_np_dilated_mask = (mask_out == 0)
-
- mask_out[img_np_dilated_mask] = img_np_dilated_with_color[img_np_dilated_mask]
- dilated_mask = Image.fromarray(mask_out.astype(np.uint8) * 255)
- return dilated_mask, mask_out
-
- def dilate_and_colorize(image_path, kernel_size):
- img_np = np.array(Image.open(image_path).convert('L'))
- img_np_dilated = dilate_mask(img_np, kernel_size)[1]
-
- return Image.fromarray(img_np_dilated)
-
-
- # Utilisation de la fonction
- image_path = "mask.png"
- kernel_size = 64 # Plus c'est grand, plus c'est long :(
- dilate_and_colorize(image_path, kernel_size).save("mask3.png" )
|
|