¿Cómo puedo recortar imágenes, como lo hice antes en PIL, usando OpenCV?
Ejemplo de trabajo en PIL
im = Image.open('0.png').convert('L')
im = im.crop((1, 1, 98, 33))
im.save('_0.png')
¿Pero cómo puedo hacerlo en OpenCV?
Esto es lo que probé:
im = cv.imread('0.png', cv.CV_LOAD_IMAGE_GRAYSCALE)
(thresh, im_bw) = cv.threshold(im, 128, 255, cv.THRESH_OTSU)
im = cv.getRectSubPix(im_bw, (98, 33), (1, 1))
cv.imshow('Img', im)
cv.waitKey(0)
Pero no funciona.
Creo que lo usé incorrectamente getRectSubPix
. Si este es el caso, explique cómo puedo usar esta función correctamente.
crop_img = img[margin:-margin, margin:-margin]
Tenía esta pregunta y encontré otra respuesta aquí: copiar región de interés
Si consideramos (0,0) como la esquina superior izquierda de la imagen llamada
im
con de izquierda a derecha como dirección xy de arriba hacia abajo como dirección y. y tenemos (x1, y1) como el vértice superior izquierdo y (x2, y2) como el vértice inferior derecho de una región rectangular dentro de esa imagen, entonces:Aquí hay un recurso completo sobre indexación y corte de matriz numpy que puede brindarle más información sobre cosas como recortar una parte de una imagen. las imágenes se almacenarían como una matriz numpy en opencv2.
:)
fuente
im
no se haya leído correctamente y esté vacía. intente usar un IDE con puntos de interrupción para diagnosticar su código paso a paso. puede usar google colab para crear bloques de código y puede compartir su cuaderno jupytor en la sala de chat de python stackoverflow para obtener ayuda de alguien.Tenga en cuenta que, rebanar la imagen no es la creación de una copia de la
cropped image
pero la creación de unapointer
a laroi
. Si está cargando tantas imágenes, recorta las partes relevantes de las imágenes con un corte y luego las agrega a una lista, esto podría ser un gran desperdicio de memoria.Suponga que carga N imágenes cada una
>1MP
y solo necesita una100x100
región desde la esquina superior izquierda.Slicing
:Alternativamente, puede copiar la parte relevante por
.copy()
, para que el recolector de basura se elimineim
.Después de descubrir esto, me di cuenta de que uno de los comentarios del usuario1270710 mencionaba eso, pero me llevó bastante tiempo descubrirlo (es decir, depuración, etc.). Entonces, creo que vale la pena mencionarlo.
fuente
copy()
el ROI, en comparación con el corte, ¿cuál sería el resultado? Además, si tengo una variabletmp
en la que almaceno cada imagen que cargo desde mi computadora, el corte no debería tener un impacto negativo en mi memoria, ¿verdad? El problema que describe solo está relacionado con lo que sucede cuando carga todas las imágenes y luego las almacena de nuevo ROI, teniendo tanto los originales como el ROI . Por favor, avíseme si entendí bien.este código recorta una imagen de x = 0, y = 0 posición a h = 100, w = 200
fuente
A continuación se muestra la forma de recortar una imagen.
ruta de la imagen: la ruta a la imagen para editar
coords: una tupla de coordenadas x / y (x1, y1, x2, y2) [abra la imagen en mspaint y verifique la "regla" en la pestaña de vista para ver las coordenadas]
ubicación_ guardada : ruta para guardar la imagen recortada
fuente
Recorte robusto con la función de borde de copia opencv:
fuente
x1,y1,x2,y2 = bbox
al decir:TypeError: 'int' object is not iterable
Aquí hay un código para un imcrop más robusto (un poco como en matlab)
fuente
Alternativamente, puede usar el flujo de tensor para el recorte y openCV para hacer una matriz a partir de la imagen.
Ahora
img
es una matriz de formas (altura de imagen, ancho de imagen, 3). Recorte la matriz con tensorflow:Vuelva a montar la imagen con tf.keras, para que podamos verla si funcionó:
Esto imprime la imagen en un cuaderno (probado en Google Colab).
Todo el código juntos:
fuente