segmentacion rectangulos objetos imagenes detectar deteccion con canny bordes python image image-processing

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)