rectangulos - Añadiendo bordes a una imagen usando python
detectar imagenes con python (6)
Alternativamente, si está utilizando OpenCV , tienen una función llamada copyMakeBorder
que le permite agregar relleno a cualquiera de los lados de una imagen. Más allá de los colores sólidos, también tienen algunas opciones geniales para bordes elegantes como reflejar o extender la imagen.
import cv2
img = cv2.imread(''image.jpg'')
color = [101, 52, 152] # ''cause purple!
# border widths; I set them all to 150
top, bottom, left, right = [150]*4
img_with_border = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_CONSTANT, value=color)
Fuentes: OpenCV border tutorial y OpenCV 3.1.0 Docs para copyMakeBorder
Tengo un gran número de imágenes de un tamaño fijo (por ejemplo, 500 * 500). Quiero escribir una secuencia de comandos de python que los redimensionará a un tamaño fijo (por ejemplo, 800 * 800) pero mantendré la imagen original en el centro y llenará el área en exceso con un color fijo (por ejemplo, negro).
Estoy usando PIL. Ahora puedo cambiar el tamaño de la imagen usando la función de cambio de resize
, pero eso cambia la relación de aspecto. ¿Hay alguna manera de hacer esto?
El método de crop
de PIL puede realmente manejar esto por usted utilizando números que están fuera del cuadro delimitador de la imagen original, aunque no está explícitamente establecido en la documentación . Los números negativos para la izquierda y la parte superior agregarán píxeles negros a esos bordes, mientras que los números mayores que el ancho y la altura originales para la derecha y la parte inferior agregarán los píxeles negros a esos bordes.
Este código tiene en cuenta los tamaños de píxeles impares:
from PIL import Image
with Image.open(''/path/to/image.gif'') as im:
old_size = im.size
new_size = (800, 800)
if new_size > old_size:
# Set number of pixels to expand to the left, top, right,
# and bottom, making sure to account for even or odd numbers
if old_size[0] % 2 == 0:
add_left = add_right = (new_size[0] - old_size[0]) // 2
else:
add_left = (new_size[0] - old_size[0]) // 2
add_right = ((new_size[0] - old_size[0]) // 2) + 1
if old_size[1] % 2 == 0:
add_top = add_bottom = (new_size[1] - old_size[1]) // 2
else:
add_top = (new_size[1] - old_size[1]) // 2
add_bottom = ((new_size[1] - old_size[1]) // 2) + 1
left = 0 - add_left
top = 0 - add_top
right = old_size[0] + add_right
bottom = old_size[1] + add_bottom
# By default, the added pixels are black
im = im.crop((left, top, right, bottom))
En lugar de la tupla de 4, en su lugar, puede usar una tupla de 2 para agregar el mismo número de píxeles en la parte izquierda / derecha y la parte superior / inferior, o una tupla de 1 para agregar el mismo número de píxeles en todos los lados.
Es importante considerar la vieja dimensión, la nueva dimensión y su diferencia aquí. Si la diferencia es impar (no es par), deberá especificar valores ligeramente diferentes para los bordes izquierdo, superior, derecho e inferior .
Supongamos que la dimensión antigua es ow, oh y la nueva es nw, nh. Entonces, esta sería la respuesta:
import Image, ImageOps
img = Image.open(''original-image.png'')
deltaw=nw-ow
deltah=nh-oh
ltrb_border=(deltaw/2,deltah/2,deltaw-(deltaw/2),deltah-(deltah/2))
img_with_border = ImageOps.expand(img,border=ltrb_border,fill=''black'')
img_with_border.save(''imaged-with-border.png'')
Puede cargar la imagen con scipy.misc.imread
como una matriz numpy. Luego cree una matriz con el fondo deseado con numpy.zeros((height, width, channels))
y pegue la imagen en la ubicación deseada:
import numpy as np
import scipy.misc
im = scipy.misc.imread(''foo.jpg'', mode=''RGB'')
height, width, channels = im.shape
# make canvas
im_bg = np.zeros((height, width, channels))
im_bg = (im_bg + 1) * 255 # e.g., make it white
# Your work: Compute where it should be
pad_left = ...
pad_top = ...
im_bg[pad_top:pad_top + height,
pad_left:pad_left + width,
:] = im
# im_bg is now the image with the background.
Puede crear una nueva imagen con el nuevo tamaño deseado, y pegar la imagen antigua en el centro y luego guardarla. Si lo desea, puede sobrescribir la imagen original (¿está seguro?; O)
import Image
old_im = Image.open(''someimage.jpg'')
old_size = old_im.size
new_size = (800, 800)
new_im = Image.new("RGB", new_size) ## luckily, this is already black!
new_im.paste(old_im, ((new_size[0]-old_size[0])/2,
(new_size[1]-old_size[1])/2))
new_im.show()
# new_im.save(''someimage.jpg'')
Sí hay.
Haz algo como esto:
import Image, ImageOps
ImageOps.expand(Image.open(''original-image.png''),border=300,fill=''black'').save(''imaged-with-border.png'')
Puedes escribir lo mismo en varias líneas:
import Image, ImageOps
img = Image.open(''original-image.png'')
img_with_border = ImageOps.expand(img,border=300,fill=''black'')
img_with_border.save(''imaged-with-border.png'')
Y dices que tienes una lista de imágenes. Luego debes usar un ciclo para procesarlas todas:
import Image, ImageOps
for i in list-of-images:
img = Image.open(i)
img_with_border = ImageOps.expand(img,border=300,fill=''black'')
img_with_border.save(''bordered-%s'' % i)