11
votes

Comment réduire une taille d'image dans le traitement de l'image (Scipey / Numpy / Python)

Bonjour j'ai une image (1024 x 1024) et j'ai utilisé la commande "de gefIile" en numpy pour mettre chaque pixel de cette image dans une matrice.

Comment puis-je réduire la taille de l'image (ex. 512 x 512) En modifiant la matrice A? P>

a = numpy.fromfile(( - path - ,'uint8').reshape((1024,1024))


4 commentaires

Est-ce que la question que vous ne comprenez pas comment le faire en python ou que vous ne comprenez pas comment faire la mise à l'échelle de l'image ou les deux?


La longue réponse est que cela dépend du type d'image que vous venez de lire. La réponse courte / question est "Pourquoi ne pouvez-vous pas utiliser une bibliothèque?". Êtes-vous en mesure d'avoir PIL redimensionner, puis vous pouvez appeler Numpy.Reshape ()?


L'image est dans l'extension de fichier .dat, et le lecteur que j'ai obtenu peut lire l'image et la mettre dans une matrice. J'ai commis une erreur alors j'ai édité le message et changez "Array" sur "Matrix" car il est placé sous forme de formulaire matriciel.


Maintenant, ce que j'ai un problème, c'est comment prendre seulement une ligne et même une colonne de la matrice. Y a-t-il une fonction dans Scipital ou Numpy qui peut faire cela?


3 Réponses :


3
votes

Je pense que le moyen le plus facile est de ne prendre que des colonnes et des rangées de l'image. Faire un échantillon de la matrice. Prenons par exemple, seules ces lignes encore et les colonnes paires, mettez-la dans un nouveau tableau et vous auriez une nouvelle image de taille.


5 commentaires

@Learnmore - C'est aussi simple que y = x [:: 2, :: 2] (ou :: 3 si vous vouliez chaque troisième rangée, etc.). Sachez simplement que cela provoquera des problèmes d'aliasing, car il s'agit essentiellement d'une interpolation «voisine la plus proche» (c'est très très rapide, cependant). La réponse de Tillsten est une bien meilleure façon en général, mais aura plus de frais généraux. Tout dépend de ce que vous devez faire exactement.


@Joe Kington - merci. Y = x [:: 2, :: 2] est le premier ":: 2" signifie que toutes les 2 lignes et la seconde ":: 2" signifie obtenir toutes les 2 colonnes? et est x la matrice que j'ai à l'origine et y est la nouvelle matrice?


Oui j'ai essayé et à l'origine la taille est 2048 x 2048. Il est maintenant 1024 x 1024. Merci beaucoup


La bonne façon de le faire est cependant décrite ci-dessous. Utilisez la fonction de zoom.


C'est la mauvaise façon de redimensionner. Si votre image contient des lignes noires et blanches alternativement sur toutes les colonnes de pixels et la ligne sage, vous vous retrouverez avec une image noire ou blanche complète à la fin. La bonne voie consiste à utiliser l'interpolation comme décrit ci-dessous.



17
votes

Utilisez la fonction de zoom de Scipy:

http://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.zoom.html#scipy.ndimage.zoom p>

from scipy.ndimage.interpolation import zoom
a = np.ones((1024, 1024))
small_a = zoom(a, 0.5)


0 commentaires

21
votes

Si vous souhaitez redimensionner une résolution spécifique, utilisez sciped.misc.imresize: xxx


3 commentaires

Je pense que c'est la bonne réponse. Simple, fonctionne directement avec le format de tableau numpy d'image. Merci!


Il est obscuré dans SciPy 1.0.0, skimage.transform.Resize doit être utilisé


Malheureusement, l'alternative de la skimage n'a actuellement pas une option "voisine la plus proche", donc si vous en avez besoin, dites, Downsize Sensor Data de 1280 à 224, vous devrez faire des mathématiques supplémentaires vous-même.