A biblioteca OpenCV Python tornou possível automatizar o processo de fusão de várias imagens em uma única imagem panorâmica.

A fotografia panorâmica é a técnica de capturar um campo de visão mais amplo que uma única fotografia não pode alcançar. Essa técnica une várias imagens para criar uma única imagem que captura toda a cena de maneira imersiva.

Com a ajuda do Python, você pode automatizar esse processo e criar belos panoramas com facilidade.

Configurando seu ambiente Python

Para seguir, você deve ter um entendimento básico de Python. Inicie qualquer IDE Python e criar um novo ambiente virtual. Crie um novo arquivo Python. E no terminal, execute o seguinte comando para instalar o OpenCV.


pip instalar opencv-contrib-python

Você vai usar o opencv-contrib-python biblioteca para carregar imagens e manipulá-las. tem o cv2.Stitcher classe que você usará para criar os panoramas.

O código-fonte completo e as imagens de amostra usadas neste artigo estão disponíveis neste Repositório GitHub.

Importando as bibliotecas necessárias

Importar o cv2 e os módulos em seu script. Você usará o sistema operacional para navegar pelos caminhos do sistema.

importar cv2
importar os

O módulo do sistema operacional é um módulo integrado do Python. Esta é a razão pela qual você não precisa instalá-lo externamente.

Carregando as imagens

Crie uma função para carregar as imagens que deseja costurar. Primeiro, crie uma lista vazia que armazenará as imagens iniciais. Em seguida, percorra cada arquivo no caminho da pasta, verificando se o arquivo é uma imagem. Se for uma imagem, carregue-a e anexe-a à lista de imagens.


defcarregar_imagens(caminho_da_pasta):
# Carregue imagens de uma pasta e redimensione-as.
imagens = []
para nome do arquivo em os.listdir (folder_path):
# Verifica se o arquivo é um arquivo de imagem
se filename.endswith('.jpg') ou filename.endswith('.png'):
# Carregue a imagem usando o OpenCV e redimensione-a
image = cv2.imread (os.path.join (folder_path, filename))
images.append (imagem)
retornar imagens

Você pode adicionar mais formatos de arquivo de imagem para diversificar seu programa. Este código só irá procurar .jpg e .png formatos de arquivo.

Redimensionando as imagens para um ponto uniforme e processamento mais rápido

Crie uma função que irá redimensionar a lista de imagens. A função percorrerá cada imagem na lista e a redimensionará. Por fim, anexe as imagens redimensionadas a uma nova lista.


defresize_images(imagens, largura, altura):
imagens_redimensionadas = []
para imagem em imagens:
resized_image = cv2.resize (imagem, (largura, altura))
resized_images.append (resized_image)
retornar imagens_redimensionadas

O redimensionamento garante que a costura das imagens seja uniforme. Ele também reduz o tamanho do arquivo para um processamento mais rápido.

Usando o módulo Stitcher do OpenCV para costurar as imagens

Crie uma função para juntar as imagens redimensionadas. Essa técnica é comumente conhecida como criação de um panorama. A função receberá uma lista de imagens como entrada. Use o Costureira módulo para uni-los. Por fim, a função retornará uma imagem costurada e um código de status.


defStitch_images(imagens):
costureiro = cv2.Stitcher.create()
(status, stitched_image) = stitcher.stitch (imagens)
se status == cv2.STITCHER_OK:
retornar imagem_costurada
outro:
retornarNenhum

Se a costura foi bem-sucedida (conforme indicado pelo cv2.STITCHER_OK código de status), a função retornará a imagem costurada. Caso contrário, ele retornará Nenhum.

Recortando a Imagem Costurada

Crie uma função que pegue a imagem costurada e a retorne depois de cortá-la. Primeiro, converta a imagem costurada em tons de cinza. Em seguida, aplique um limite binário para criar uma imagem binária. Finalmente, encontre o maior contorno na imagem binária e calcule seu retângulo delimitador.


defCortar imagem(imagem):
cinza = cv2.cvtColor (imagem, cv2.COLOR_BGR2GRAY)
limiar = cv2.limite (cinza, 0, 255, cv2.THRESH_BINARY)[1]
contornos = cv2.findContours (thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
x, y, w, h = cv2.boundingRect (contours[0])
cropped_image = imagem[y: y + h, x: x + w]
retornar cropped_image

A imagem costurada é cortada usando o retângulo delimitador.

Visualizando e salvando a imagem costurada usando o OpenCV

Crie uma função que exiba a imagem costurada em uma janela interativa e a salve no disco.


defpreview_and_save_image(imagem, caminho_da_pasta, nome_da_pasta):
# Exibe a imagem costurada
cv2.namedWindow('Imagem Costurada', cv2.WINDOW_NORMAL)
cv2.imshow('Imagem Costurada', imagem)
cv2.waitKey(0)

# Salve a imagem costurada
output_filename = os.path.join (folder_path, folder_name + '_panorama.jpg')
cv2.imwrite (output_filename, imagem)
imprimir('Imagem costurada salva para pasta:', nome da pasta)

A imagem panorâmica é salva na mesma pasta que contém as imagens originais.

Controlando o fluxo do seu programa

Crie uma função que irá controlar o fluxo do seu programa. Ele carregará todas as imagens da pasta especificada. Redimensione e costure-os juntos. Recorte a imagem unida, exiba sua visualização e salve-a no disco. Se houver menos de duas imagens na pasta, a função imprimirá uma mensagem de erro e retornará sem costurar ou salvar.


defpasta_ponto(caminho_da_pasta, largura=800, altura=800):
# Costure todas as imagens em uma pasta e salve o resultado.
# Carregue as imagens da pasta
imagens = load_images (folder_path)

# Verifique se há pelo menos duas imagens na pasta
se len (imagens) < 2:
imprimir('Não há imagens suficientes na pasta:', caminho_da_pasta)
retornar

# Redimensione as imagens
resized_images = resize_images (imagens, largura, altura)

# Costure as imagens
imagem_costurada = imagens_pontos (imagens_redimensionadas)
se imagem_costurada éNenhum:
imprimir('Falha na junção da pasta:', caminho_da_pasta)
retornar

# Corte a imagem costurada
cropped_image = crop_image (imagem_costurada)

# Visualize e salve a imagem costurada
folder_name = os.path.basename (folder_path)
preview_and_save_image (cropped_image, folder_path, folder_name)

Passe o caminho da pasta que contém as imagens que deseja costurar.

pasta_ponto('imagens_amostra') 

As imagens que você usa devem conter recursos sobrepostos. Esses recursos podem ser qualquer coisa, desde pontos de referência proeminentes até padrões de textura na imagem. O OpenCV os usa como ponto de referência para alinhar as imagens.

Sem esses recursos, será difícil para o OpenCV alinhar as imagens e criar um panorama perfeito.

Testando seu programa

Colete as imagens que deseja transformar em uma imagem panorâmica. Certifique-se de que eles tenham recursos sobrepostos.

Dê uma olhada na colina nesta primeira imagem.

Nesta segunda imagem, o morro está levemente visível. Isso cria um recurso de sobreposição.

Salve as imagens em uma pasta. Passe o caminho da pasta para o pasta_ponto função para costura. E então execute o programa.

O programa uniu as imagens e criou uma imagem panorâmica com uma visão mais ampla da cena. Observe que, para criar a imagem panorâmica acima, foram usadas nove imagens que estão presentes no repositório GitHub mencionado acima.

Manipulação de Imagens Usando OpenCV

A criação de panoramas demonstra algumas das muitas técnicas de manipulação de imagem que o OpenCV oferece. Existem mais técnicas que você pode usar para manipular imagens para atender às suas necessidades. Trabalhar em mais projetos envolvendo manipulação de imagens ajudará você a melhorar suas habilidades de visão computacional em geral.