2017-09-24 4 views
2

J'essaye de créer comme un bitmap pour une image d'une lettre mais je n'ai pas le résultat désiré. Cela fait quelques jours que j'ai commencé à travailler avec des images. J'ai essayé de lire l'image, de créer un tableau numérique et d'enregistrer le contenu dans un fichier. J'ai écrit le soufflet de code:Transformer une image en bitmap

import numpy as np 
from skimage import io 
from skimage.transform import resize 

image = io.imread(image_path, as_grey=True) 
image = resize(image, (28, 28), mode='nearest') 
array = np.array(image) 
np.savetxt("file.txt", array, fmt="%d") 

Je suis en train d'utiliser des images comme dans ce lien ci-dessous:

Letter "e"

je tentais de créer un tableau de 0 et de 1. Où les 0 représentent les pixels blancs et les 1 représentent les pixels noirs. Puis, quand je sauvegarde le résultat dans un fichier, je peux voir le format de la lettre.

Quelqu'un peut-il me guider sur la façon d'obtenir ce résultat?

Merci.

Répondre

1

vérifier celui-ci:

from PIL import Image 
import numpy as np 

img = Image.open('road.jpg') 
ary = np.array(img) 

# Split the three channels 
r,g,b = np.split(ary,3,axis=2) 
r=r.reshape(-1) 
g=r.reshape(-1) 
b=r.reshape(-1) 

# Standard RGB to grayscale 
bitmap = list(map(lambda x: 0.299*x[0]+0.587*x[1]+0.114*x[2], 
zip(r,g,b))) 
bitmap = np.array(bitmap).reshape([ary.shape[0], ary.shape[1]]) 
bitmap = np.dot((bitmap > 128).astype(float),255) 
im = Image.fromarray(bitmap.astype(np.uint8)) 
im.save('road.bmp') 

Le programme prend une image rgb et il convertit dans un tableau numpy. Il le divise ensuite en 3 vecteurs, un pour chaque canal. J'utilise les vecteurs de couleur pour créer un vecteur gris. Après cela, il compère des éléments avec 128, si inférieur à écrit 0 (noir) sinon 255. L'étape suivante est reshape et enregistrer.

road.jpg road.bmp

+0

Cela m'a beaucoup aidé. Je vous remercie. Et si j'avais besoin de redimensionner tous mes bitmaps en 32x32? Comment pourrais-je le faire? –

+0

Je voudrais redimensionner l'image en 32x32 ou autre résolution, sans trop la déformer et perdre son format. Je voudrais une résolution par défaut afin que je puisse créer un ensemble de données de ces images. –

+0

Heureux que ça a marché. Désolé, je n'ai pas cette réponse. J'utilise moi-même tensorflow et j'ai peu d'expérience avec opencv. Je ne sais pas si ça vaut le coup pour vous mais je suggère que vous choisissiez une bibliothèque qui couvre vos besoins, respectez-la et si vous rencontrez des problèmes, demandez dans stackoverflow. Amusez-vous :) – prometeu

1

Il faut trois étapes pour le faire. Convertissez d'abord l'image originale en une liste de pixels. Deuxièmement, changez chaque pixel en noir (0,0,0) ou en blanc (255,255,255). Troisième convertir la liste en image et enregistrez-le.

Code

:

from PIL import Image 

threshold = 10 

# convert image to a list of pixels 
img = Image.open('letter.jpg') 
pixels = list(img.getdata()) 

# convert data list to contain only black or white 
newPixels = [] 
for pixel in pixels: 
    # if looks like black, convert to black 
    if pixel[0] <= threshold: 
     newPixel = (0, 0, 0) 
    # if looks like white, convert to white 
    else: 
     newPixel = (255, 255, 255) 
    newPixels.append(newPixel) 

# create a image and put data into it 
newImg = Image.new(img.mode, img.size) 
newImg.putdata(newPixels) 
newImg.save('new-letter.jpg') 

threshold est ce qui décide un pixel est noir ou blanc, comme vous pouvez le voir le code. Seuil de 50 ressemble à ce enter image description here, seuil de 30 ressemble à ceci enter image description here, seuil de 10 ressemble à ce enter image description here, si vous l'affinez à 5, la sortie commence à perdre des pixels: enter image description here.