2017-10-10 6 views
1

Il est difficile de trouver un titre vraiment descriptif pour cette question mais, fondamentalement, je veux rendre les couleurs gris clair plus blanches.Changer la couleur des pixels en fonction de sa couleur

Pour l'instant je fais quelque chose comme ça:

# Separate channels of image (from BGR format) 
b, g, r = gray[:, :, 0], gray[:, :, 1], gray[:, :, 2] 

# Create a mask for the whitish pixels 
mask = (b > 128) & (g > 128) & (r > 128) 

# Put thoses pixels as white 
gray[:, :, :3][mask] = [255, 255, 255] 

Mais je ne veux pas être blanc complet mais seulement plus blanc, afin de prendre en compte leur valeur actuelle. Voici le pseudo code d'un exemple de fonction:

if (r>128 && g>128 && b>128) 
    r = r + (255-r)/2 
    g = ... 

Comment puis-je faire cela en python? Merci d'avance pour votre aide, et j'espère que c'était assez clair.

+1

Quelle est la question? –

Répondre

2

Avec a comme image RVB d'entrée, deux approches vectorisées pourraient être suggérées.

Approche # 1: Créer le masque des endroits à modifier en gardant les dimensions et utiliser np.where pour faire le choix entre les nouvelles valeurs et anciennes valeurs et créer ainsi un nouveau tableau d'images -

mask = (a > 128).all(-1,keepdims=True) 
new_vals = a + (255 - a)//2 
a = np.where(mask, new_vals, a) 

approche # 2: Créer le masque des endroits à modifier sans garder les dimensions et que nous allons nous utilisons boolean-indexing pour modifier in situ -

mask = (a > 128).all(-1,keepdims=False) 
a_masked = a[mask] 
new_vals_masked = a_masked + (255 - a_masked)//2 
a[mask] = new_vals_masked 

run Exemple -

In [34]: np.random.seed(0) 

In [35]: a = np.random.randint(0,255,(2,2,3)).astype(np.uint8) 

In [36]: a[0,0] = [200,180,160] 

In [37]: a[1,1] = [170,150,220] 

In [38]: a # Original image array 
Out[38]: 
array([[[200, 180, 160], 
     [192, 67, 251]], 

     [[195, 103, 9], 
     [170, 150, 220]]], dtype=uint8) 

In [39]: mask = (a > 128).all(-1,keepdims=True) 
    ...: new_vals = a + (255 - a)//2 
    ...: a = np.where(mask, new_vals, a) 
    ...: 

In [40]: a # New array 
Out[40]: 
array([[[227, 217, 207], 
     [192, 67, 251]], 

     [[195, 103, 9], 
     [212, 202, 237]]], dtype=uint8) 
+1

Merci, c'est tout! Je ne savais même pas qu'il y avait une telle fonction que np.where() ^^ –