Convertir image en chaine d'ADN
RésoluSoma1316 Messages postés 17 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Ce code convertit trois matrices RGB en chaînes d'ADN, mais cela n'a pas fonctionné pour moi. Alors où est le problème ?
import numpy as np from PIL import Image def binary_to_dna(bin_arr): dna_arr = [] for i in range(0, len(bin_arr), 2): if bin_arr[i : i + 2] == [0, 0]: dna_arr.append('A') elif bin_arr[i : i + 2] == [0, 1]: dna_arr.append('C') elif bin_arr[i : i + 2] == [1, 0]: dna_arr.append('G') elif bin_arr[i : i + 2] == [1, 1]: dna_arr.append('T') return ''.join(dna_arr) img = Image.open('C:/image.gif').convert('RGB') pix = np.array(img) # en pixel red = pix[:, :, 0] green = pix[:, :, 1] blue = pix[:, :, 2] # en binaire r = np.unpackbits( red, axis=1) g = np.unpackbits(green,axis=1) b = np.unpackbits(blue,axis=1) # en sequence ADN r_dna = binary_to_dna(r) g_dna = binary_to_dna(g) b_dna = binary_to_dna(b)
Erreur:
c:\Users\ACER\code\test22.py:51: DeprecationWarning: elementwise comparison failed; this will raise an error in the future.
if bin_arr[i:i+2]==[0,0]:
Merci
- Convertir image en chaine d'ADN
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Chaine tnt gratuite sur mobile - Guide
- Image iso - Guide
- Convertir epub en kindle - Guide
- Convertir youtube en mp3 avec audacity - Guide
2 réponses
Bonjour,
En fait il faudrait déjà expliquer ce que tu veux faire, car il y a plusieurs manière de corriger ce message d'erreur, mais ces corrections n'ont pas la même signification. En particulier, on ne sait pas comment est encodée ton image. Dans le cas général pix est un np.array (H, W, N) où :
- H est la hauteur de l'image,
- W la largeur de l'image
- N le nombre de canaux (typiquement 3 pour une image RGB)
Ton code semble supposer que W=1 et N=2. Est-ce le cas (que vaut pix.shape) ?
Ensuite il y a au moins quelque chose d'étrange sur la borne supérieure de i pour pouvoir parler de i+2 (quand i va attendre len(bin_arr) - 1, le slice ne va considérer qu'un seul élément de bin_arr).
Hormis cela, voici deux solutions possibles :
- Soit tu compares deux np.array (mais il faut que tu sois conscient.e que dans bin_array[i : i + 2] comporte deux tableaux (note que selon ce que tu veux faire, all peut être remplacé par any)
def binary_to_dna(bin_arr): dna_arr = [] for i in range(0, len(bin_arr) - 1, 2): if bin_arr[i : i + 2].all() == np.array([0, 0]).all(): dna_arr.append('A') elif bin_arr[i : i + 2].all() == np.array([0, 1]).all(): dna_arr.append('C') elif bin_arr[i : i + 2].all() == np.array([1, 0]).all(): dna_arr.append('G') elif bin_arr[i : i + 2].all() == np.array([1, 1]).all(): dna_arr.append('T') return ''.join(dna_arr)
- Soit tu extrais les deux valeurs (au lieu de prendre un slice), puis tu fais une comparaison de listes.
def binary_to_dna(bin_arr): dna_arr = [] for i in range(0, len(bin_arr) - 1, 2): l = [bin_arr[i, 0], bin_arr[i + 1, 0]] if l == [0, 0]: dna_arr.append('A') elif l == [0, 1]: dna_arr.append('C') elif l == [1, 0]: dna_arr.append('G') elif l == [1, 1]: dna_arr.append('T') break return ''.join(dna_arr)
Bonne chance
Merci beaucoup.