7
votes

Python ajoutant une zone supplémentaire à l'image

J'ai donc une table avec des tailles d'image. Il existe plusieurs images de différentes tailles (66x66, 400x400, etc.). J'ai un exemple d'image (l'original) qui a toujours une taille de 600x532, et sur cette image est un produit (une télévision, un PC, etc.).

Je dois redimensionner cette image, ce qui n'est pas un problème. Mais si je fais cela avec proportion, je reçois quelque chose comme 66x55. Si je ne fais pas cela avec proportion, l'image n'a pas l'air bien. P>

de sorte que le fond de l'original est toujours blanc. Existe-t-il un moyen d'étendre la zone de l'image et de remplir le reste avec blanc? Donc, comme ceci: 600x532 -> 600x600 -> 66x66 etc etc. P>

Il devrait être comme une culture anti-récolte. P>

EDIT: J'ai découvert que si j'utilise Crop () de Pil et au lieu de "minimiser" en utilisant une valeur au-dessus de la taille d'image réelle qui crée ma zone supplémentaire. Mais ça va être noir. Une idée de la façon dont je pourrais remplir cette zone blanche? P>

Edit2: Je suppose que cela a quelque chose à voir avec ImageDraw. P>

Edit3: Après avoir découvert que Imagayraw était la solution, mon problème était résolu. Veuillez fermer ceci. P>

voici ma solution: p> xxx pré>

La prochaine chose que je ferai est de faire la culture supplémentaire ci-dessus et sous. Donc, la photo reste au milieu. P>

EDIT4: Solution finale P>

img1 = Image.open("img1.jpg")
img2 = img1.crop( (0,-34,600,566) )  
draw = ImageDraw.Draw(img2)
draw.rectangle( (0,0,600,34), fill="white" )
draw.rectangle( (0,566,600,600), fill="white" )
del draw
img2.save("img2.jpg", "JPEG", quality=75)


4 commentaires

Quelle bibliothèque / classe utilisez-vous pour représenter vos images? Si votre image est une matrice numpue, il ne devrait pas être de problème pour créer une nouvelle image blanche et copier les pixels orginaux vers le nouveau.


J'utilise Python Image Bibliothèque. Mais j'ai déjà découvert. Mais s'il y a une meilleure solution, je serais heureux d'écouter :)


Veuillez poster la solution comme réponse à votre propre question. Ensuite, vous pouvez la fermer vous-même (après 24h).


Ok, je le ferai, mais je ne peux qu'après 8 heures.


3 Réponses :


15
votes

supposant que nous utilisions PIL pour traiter l'image xxx pré>

Vous pouvez redimensionner un objet d'image PIL, IMG par exemple p>

>>> from PIL import Image
>>> img = Image.open('path/to/image')
>>> square_one = white_bg_square(img)
>>> square_one.resize((100, 100), Image.ANTIALIAS)
>>> square_one.save('path/to/result')


3 commentaires

Vous pouvez aussi consulter cette réponse pour une autre solution Stackoverflow.com/questions/11664038/...


Belle solution courte! Dans votre Lambda, vous voudrez peut-être ajouter un int (); Sinon, il échoue parfois.


Dans le cas où l'une des tailles n'est même pas utilisée: couche.paste (img, tuple (carte (Lambda x: int ((x [0] -x [1]) / 2), zip (taille, img.size)) )) dans la fonction



1
votes

Ma solution finale xxx


0 commentaires

1
votes

Si nous utilisons OpenCV pour traiter l'image.

import cv2
import numpy as np

def make_square(self, image_in):
   size = image_in.shape[:2]
   max_dim = max(size)
   delta_w = max_dim - size[1]
   delta_h = max_dim - size[0]
   top, bottom = delta_h//2, delta_h-(delta_h//2)
   left, right = delta_w//2, delta_w-(delta_w//2)
   color = [255, 255, 255]
   #image_out = cv2.copyMakeBorder(image_in, top, bottom, left, right, cv2.BORDER_CONSTANT, value=color)
   image_out = cv2.copyMakeBorder(image_in, top, bottom, left, right, cv2.BORDER_REPLICATE, value=color)
   return image_out

image_in = cv2.imread(image_path)


1 commentaires

merci pour la grande solution. Je voudrais ajouter les différences entre cv2.borader_replicate et cv2.border_constant. Le premier crée une frontière "reproduisant" les pixels. La seconde crée une bordure dans la couleur choisie.