Corte suas fotos com Python
Com as bibliotecas poderosas do Python à nossa disposição, podemos realizar tarefas complexas de edição de imagens com facilidade. Uma dessas tarefas é cortar fotos ou imagens.
O Python oferece várias bibliotecas para lidar com operações de imagens de forma simples. Duas delas são a biblioteca Pillow (um fork do PIL) e OpenCV.
Pillow é perfeita para manipulações básicas. Sua API simplifica as tarefas de processamento de imagens sem se aprofundar em estruturas de código complexas. No entanto, em casos de uso mais avançados, onde precisamos de interação em tempo real para cortar uma imagem com base nas entradas dos usuários, o OpenCV assume a liderança. Ele fornece recursos robustos necessários para lidarmos com essas tarefas.
Função de corte simples usando Pillow
Realizar cortes de imagens simples com Pillow é fácil, mas é não interativo! Vamos entender o que isso significa com um exemplo.
No exemplo abaixo, mostramos um exemplo de uma função simples de corte de imagens usando a biblioteca Pillow. Nossa função demonstra como é fácil cortar imagens com apenas algumas linhas de código, mas usando coordenadas definidas manualmente:
from PIL import Image # importa Image - se precisar instalar antes no seu ambiente: pip install pillow
def corta_foto_com_pillow(caminho_entrada, caminho_saida):
""" corta foto/imagem com Pillow """
img = Image.open(caminho_entrada) # abre imagem/foto
x_inicio, y_inicio = 400, 200 # # coordenadas iniciais do corte - modifique para o seu caso
w, h = 400, 400 # largura e altura - modifique para o seu caso
# Corta imagem usando as medidas definidas para criar uma caixa
img_cortada = img.crop((x_inicio, y_inicio, x_inicio + w, y_inicio + h))
img_cortada.save(caminho_saida) # salva imagem
caminho_entrada = 'local_da_sua_foto/nome_da_foto' # local de sua foto/imagem original - diretorio/nome
caminho_saida = 'local_da_sua_foto_cortada/nome_da_foto_cortada' # local para salvamento de sua foto/imagem cortada - diretorio/nome
corta_foto_com_pillow(caminho_entrada, caminho_saida) # chama função
No código acima, definimos uma função simples para cortar imagens ou fotos com Pillow. Ela aceita dois argumentos, o local da foto original (caminho_entrada) e o local para salvar a foto cortada (caminho_saida). Note que selecionamos manualmente as coordenadas para cortar nosso arquivo de entrada, definindo uma posição inicial (x_inicio e y_inicio) e depois criando uma caixa usando essa posição em combinação com a altura e largura (h e w) da área de corte. Todas as dimensões são dadas em píxeis. A limitação desse método é acertar a posição e tamanho da caixa correta do corte. Veja nosso exemplo de imagem cortada abaixo.
Função de corte simples usando OpenCV
Podemos escrever uma função bem similar à mostrada acima usando OpenCV:
import cv2 # Importa OpenCV - se precisar instalar antes no seu ambiente: pip install opencv-python
def corta_foto_com_opencv(caminho_entrada, caminho_saida):
""" corta foto com OpenCV """
img = cv2.imread(caminho_entrada) # abre imagem/foto
x_inicio, y_inicio, x_fim, y_fim = 400, 200, 850, 700 # Coordenadas da caixa de corte - ajuste conforme suas necessidades
# Corta imagem usando fatiamento
img_cortada = img[y_inicio:y_fim, x_inicio:x_fim]
cv2.imwrite(caminho_saida, img_cortada) # salva imagem
caminho_entrada = 'local_da_sua_foto/nome_da_foto'
caminho_saida = 'local_para_salvar_sua_foto_cortada/nome_da_foto_cortada'
corta_foto_com_opencv(caminho_entrada, caminho_saida) # chama função
Nossa função recebe os mesmos argumentos da função definida anteriormente com Pillow. A única diferença significativa é que o OpenCV requer a definição de quatro pontos para criar a caixa de corte ao invés de usar largura e altura como o Pillow. No entanto, assim como ocorre com Pillow, achar as coordenadas exatas desses pontos pode ser demorado! Mas, como dissemos no início do post, uma grande vantagem do OpenCV é que, além de dar conta de procedimentos básicos, ele possui recursos avançados para manipular imagens. Para cortar imagens, um de seus recursos é a seleção interativa da área de corte!
Corte de imagem interativo usando OpenCV
Nem sempre queremos perder tempo achando as coordenadas para cortar uma imagem. Nessas situações, ferramentas que permitem a seleção interativa de coordenadas são muito melhores. Para fornecer uma experiência interativa, agora demonstraremos como podemos criar uma ferramenta de corte de imagem mais avançada com recurso de seleção em tempo real utilizando o poder do OpenCV e o método cv2.selectROI(). Este método permite que os usuários definam a área de corte desejada arrastando o mouse em uma janela interativa exibindo a imagem de entrada. Veja o código abaixo:
def corta_foto_com_opencv_interativo(caminho_entrada, caminho_saida):
""" corta foto com OpenCV interativamente"""
img = cv2.imread(caminho_entrada) # abre imagem/foto
# Permite que usuário selecione a ROI (region of interest - região de interesse)
roi = cv2.selectROI("Clique e arraste o mouse para criar a caixa de corte", img, False)
# Extrai a região usando as cordenadas do usuário
img_cortada = img[int(roi[1]):int(roi[1]+roi[3]), int(roi[0]):int(roi[0]+roi[2])]
cv2.imwrite(caminho_saida, img_cortada) # salva imagem
caminho_entrada = 'local_da_sua_foto/nome_da_foto'
caminho_saida = 'local_da_sua_foto_cortada/nome_da_foto_cortada'
corta_foto_com_opencv_interativo(caminho_entrada, caminho_saida) # chama função