¿Quieres implementar un recorte/crop de imagen fácilmente? Utiliza OpenCV!!

OpenCV permite casi de todo trabajando con imágenes, en esta ocasión trataremos el recorte/crop y haremos un pequeño ejemplo de proceso de todas las imágenes de un directorio, por supuesto, con Python.

El contenido multimedia crece en nuestros equipos/smartphones/servidores de forma exponencial. Gran parte del mismo, son las imágenes. Es por ello que necesitemos de herramientas para manipular dicho contenido que permita trabajar con lotes de archivos en bloque.

Pero empecemos por lo más básico.

Recorte de imagen

Vamos a partir de la siguiente imagen. Es una captura del navegador de la web.

Quiero dejar solo la zona central del articulo, eliminando el resto de la imagen.

import cv2

path="/home/altaruru/tmp/"
file="2018-09-27-152016_1439x879_scrot.png"
fileb="2018-09-27-152016_pag1.png"

img = cv2.imread(path+file)
crop_img = img[96:828, 320:1100]
cv2.imwrite(path + fileb, crop_img)

No hay mucho que comentar:

  1. Importamos cv2 para usarla en el código
  2. Leemos imagen
  3. Recortamos y guardamos recorte en crop_img
  4. Guardamos recorte en disco.

Y este es el resultado.

 

 

Aplicar el proceso de recorte a todo un directorio

El recorte lo hemos pasado a la función cropfile para que quede más claro.

Utilizamos la función ls1 para recuperar la lista de archivos y recorremos la lista aplicando el recorte.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Sep 27 11:39:46 2018
@author: altaruru
OpenCV, cropping  images
"""
import cv2
from os import scandir

def cropfile(pathin, pathout, x, y, w, h):
    img = cv2.imread(pathin)
    crop_img = img[y:y+h, x:x+w]
    cv2.imwrite(pathout, crop_img)

path="/home/altaruru/tmp/"
files=ls1(path)
for file in files:
    filea=path + file # archivo original
    sext, sfilename = splitfilename(file)    
    filec=path + sfilename + "_crop" + ".png" # archivo crop    
    print(filec)
    cropfile(filea, filec, 320, 90, 828, 1100)

Funciones auxiliares

Las incluyo aquí para facilitar la visualización, sin embargo tienen sus propias entradas donde se explican con más detalle.

def ls1(path):    
    return [obj.name for obj in scandir(path) if obj.is_file()]

def splitfilename(filename):
    sname=""
    sext=""
    i=filename.rfind(".")
    if(i!=0):
        n=len(filename)
        j=n-i-1
        sname=filename[0:i]
        sext=filename[-j:]    
    return sext, sname

Para recuperar la lista de archivos utilizamos ls1, si tienes curiosidad puedes ver la entrada Python, ¿cómo listar los archivos de un directorio?

Para dividir el nombre del archivo en nombre y extensión utilizo splitfilename, puedes verla en Splitfilename o cómo «splitear» nombre y extensión de archivo en Python

Prueba sobre el directorio

Este es el contenido de mi directorio

Ok, ejecutamos y…

runfile('/home/altaruru/Documentos/src/pysrc/ncmfx/testOpenCV.py', wdir='/home/altaruru/Documentos/src/pysrc/ncmfx')
/home/altaruru/tmp/2018-09-27-152152_1439x879_scrot_crop.png
/home/altaruru/tmp/2018-09-27-152016_1439x879_scrot_crop.png
/home/altaruru/tmp/2018-09-27-152124_1439x879_scrot_crop.png
/home/altaruru/tmp/2018-09-27-152219_1439x879_scrot_crop.png
/home/altaruru/tmp/2018-09-27-152141_1439x879_scrot_crop.png

Vemos que ha creado una imagen nueva por cada antigua

 

Hemos visto como recorrer un directorio y crear imagenes recortando la original. Esto tiene muchas aplicaciones, ahora solo hace falta imaginarlas, o necesitarlas.

Saludos!

 

Deja tu comentario