Je voudrais prendre une image et changer l'échelle de l'image, alors que c'est un tableau numpy.
Par exemple, j'ai cette image d'une bouteille de coca-cola: bouteille-1
Ce qui se traduit par un tableau numpy de formes (528, 203, 3)
et je veux redimensionner cela pour dire la taille de cette deuxième image:
bouteille-2
Qui a une forme de (140, 54, 3)
.
Comment changer la taille de l'image en une certaine forme tout en conservant l'image d'origine? D'autres réponses suggèrent de supprimer une ligne sur deux ou la troisième, mais ce que je veux faire, c'est réduire l'image comme vous le feriez via un éditeur d'image mais en code python. Existe-t-il des bibliothèques pour faire cela dans numpy / SciPy?
Réponses:
Ouais, vous pouvez installer
opencv
(c'est une bibliothèque utilisée pour le traitement d'image et la vision par ordinateur), et utiliser lacv2.resize
fonction. Et par exemple, utilisez:Voici
img
donc un tableau numpy contenant l'image d'origine, alorsres
qu'un tableau numpy contenant l' image redimensionnée . Un aspect important est leinterpolation
paramètre: il existe plusieurs façons de redimensionner une image. D'autant plus que vous réduisez l'image et que la taille de l'image d'origine n'est pas un multiple de la taille de l'image redimensionnée. Les schémas d'interpolation possibles sont:Comme avec la plupart des options, il n'y a pas de «meilleure» option en ce sens que pour chaque schéma de redimensionnement, il existe des scénarios où une stratégie peut être préférée à une autre.
la source
dsize
devrait êtredsize=(54, 140)
comme il faut x puis y, où comme un tableau numpy montre la forme comme y puis x (y est le nombre de lignes et x est le nombre de colonnes)skimage.io.imread('image.jpg')
etskimage.transform.resize(img)
. scikit-image.org/docs/dev/install.htmlBien qu'il soit possible d'utiliser numpy seul pour ce faire, l'opération n'est pas intégrée. Cela dit, vous pouvez utiliser
scikit-image
(qui est construit sur numpy) pour faire ce genre de manipulation d'image.La documentation de redimensionnement Scikit-Image est ici .
Par exemple, vous pouvez effectuer les opérations suivantes avec votre image:
Cela prendra en charge des choses comme l'interpolation, l'anti-aliasing, etc. pour vous.
la source
anti_aliasing
drapeau, il semble qu'il a été supprimé de la version la plus récente de 0.13.1Pour les personnes venant ici de Google à la recherche d'un moyen rapide de sous-échantillonner les images dans des
numpy
tableaux pour les utiliser dans les applications d'apprentissage automatique, voici une méthode ultra rapide (adaptée à partir d' ici ). Cette méthode ne fonctionne que lorsque les dimensions d'entrée sont un multiple des dimensions de sortie.Les exemples suivants sous-échantillonnent de 128x128 à 64x64 (cela peut être facilement changé).
Dernière commande des chaînes
Première commande des chaînes
Pour les images en niveaux de gris, changez simplement le
3
en un1
comme ceci:Première commande des chaînes
Cette méthode utilise l'équivalent du pooling max. C'est le moyen le plus rapide que j'ai trouvé.
la source
np.repeat(np.repeat(a, 2, axis=0), 2, axis=1)
Si quelqu'un est venu ici à la recherche d'une méthode simple pour redimensionner / redimensionner une image en Python, sans utiliser de bibliothèques supplémentaires, voici une fonction de redimensionnement d'image très simple:
Exemple d'utilisation: redimensionnement d'une image (30 x 30) en (100 x 200):
Production:
Cela fonctionne pour réduire / redimensionner les images et fonctionne très bien avec les tableaux numpy.
la source
La
imresize()
méthode de SciPy était une autre méthode de redimensionnement, mais elle sera supprimée à partir de SciPy v 1.3.0. SciPy fait référence à la méthode de redimensionnement d'image PIL :Image.resize(size, resample=0)
size - La taille demandée en pixels, sous forme de 2-tuple: (largeur, hauteur).
resample - Un filtre de rééchantillonnage facultatif. Il peut s'agir de PIL.Image.NEAREST (utiliser le voisin le plus proche), PIL.Image.BILINEAR (interpolation linéaire), PIL.Image.BICUBIC (interpolation par spline cubique) ou PIL.Image.LANCZOS (un filtre de sous-échantillonnage de haute qualité ). En cas d'omission, ou si l'image a le mode «1» ou «P», elle est définie sur PIL.Image.NEAREST.
Lien ici: https://pillow.readthedocs.io/en/3.1.x/reference/Image.html#PIL.Image.Image.resize
la source
Sûr. Vous pouvez le faire sans OpenCV, scikit-image ou PIL.
Le redimensionnement d'image consiste essentiellement à mapper les coordonnées de chaque pixel de l'image d'origine à sa position redimensionnée.
Puisque les coordonnées d'une image doivent être des nombres entiers (pensez-y comme une matrice), si la coordonnée mappée a des valeurs décimales, vous devez interpoler la valeur du pixel pour l'approcher de la position entière (par exemple, obtenir le pixel le plus proche de cette position est connu comme Interpolation du voisin le plus proche ).
Tout ce dont vous avez besoin est une fonction qui effectue cette interpolation pour vous. SciPy a
interpolate.interp2d
.Vous pouvez l'utiliser pour redimensionner une image dans un tableau numpy, par exemple
arr
, comme suit:Bien sûr, si votre image est RVB, vous devez effectuer l'interpolation pour chaque canal.
Si vous souhaitez en savoir plus, je vous suggère de regarder Redimensionner les images - Computerphile .
la source
la source
cv2
et utilise déjà une fonction de redimensionnement appropriée au lieu de réimplémenter une fonction de redimensionnement "sous-optimale" qui fait pire que l'interpolation du plus proche voisin.