Come posso ritagliare un'immagine al centro? Perché so che la scatola è una 4-tupla che definisce la coordinata sinistra, superiore, destra e inferiore, ma non so come ottenere queste coordinate in modo che ritagli al centro.Ritagliare un'immagine al centro usando PIL
risposta
Supponendo che si conosce la dimensione che si desidera ritagliare a (X new_height new_width):
import Image
im = Image.open(<your image>)
width, height = im.size # Get dimensions
left = (width - new_width)/2
top = (height - new_height)/2
right = (width + new_width)/2
bottom = (height + new_height)/2
im.crop((left, top, right, bottom))
Questo si romperà se si tenta di ritagliare una piccola immagine più grande, ma ho intenzione di assumere hai vinto ci sto provando (o che puoi prendere quel caso e non ritagliare l'immagine).
Ok, finalmente l'ho fatto funzionare! Grazie mille. – user2401069
Piccola correzione, la coltura richiede un array. im.crop ((a sinistra, in alto, a destra, in basso)) – freakTheMighty
Nitpick: intendi una sequenza, non una matrice. :) L'arrotondamento – EOL
Un potenziale problema con la soluzione proposta è nel caso ci sia una differenza dispari tra la dimensione desiderata e la vecchia dimensione. Non puoi avere mezzo pixel su ciascun lato. Uno deve scegliere un lato per inserire un pixel in più.
Se c'è una differenza dispari per l'orizzontale, il codice riportato sotto posizionerà il pixel in più a destra, e se c'è una differenza dispari sulla verticale, il pixel in più va verso il basso.
import numpy as np
def centeredCrop(img, new_height, new_width):
width = np.size(img,1)
height = np.size(img,0)
left = np.ceil((width - new_width)/2.)
top = np.ceil((height - new_height)/2.)
right = np.floor((width + new_width)/2.)
bottom = np.floor((height + new_height)/2.)
cImg = img[top:bottom, left:right]
return cImg
non è corretto, l'immagine del risultato non avrà sempre le dimensioni richieste. La formula corretta è 'right = width - floor ((width - new_width)/2)' –
Questa è la funzione che stavo cercando:
from PIL import Image
im = Image.open("test.jpg")
crop_rectangle = (50, 50, 200, 200)
cropped_im = im.crop(crop_rectangle)
cropped_im.show()
Tratto da another answer
si conosce la dimensione dell'immagine e la dimensione dell'immagine più piccola che si desidera ottenere, I assumere? Hai qualcosa da mostrare dove hai provato? –