¿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
imcon 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
imno 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 imagepero la creación de unapointera 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
>1MPy solo necesita una100x100regió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 variabletmpen 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 = bboxal decir:TypeError: 'int' object is not iterableAquí 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
imges 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