Operações de Processamento de Imagens Utilizando OpenCV e Python

No OpenCV, imagens coloridas seguem a ordem de canais BGR (Azul, Verde, Vermelho). Para acessar ou modificar pixels individuais, utilize indexação baseada em linhas, colunas e canal.

# Exemplo de acesso a pixels em imagem colorida
azul = imagem[50, 80, 0]   # Valor do canal azul na posição (50,80)
verde = imagem[50, 80, 1]  # Valor do canal verde
vermelho = imagem[50, 80, 2]  # Valor do canal vermelho

# Modificando um pixel individual
imagem[50, 80, 0] = 200  # Altera o canal azul
imagem[50, 80, 1] = 150  # Altera o canal verde
imagem[50, 80, 2] = 100  # Altera o canal vermelho

# Modificando uma região da imagem
imagem[30:70, 40:90] = [0, 255, 0]  # Define uma área verde

# Para imagens em escala de cinza
imagem_cinza[25, 30] = 128

Para maniuplar porções específicas de uma imagem, é possível recortar regiões e copiá-las para outras áreas.

import cv2
import numpy as np

original = cv2.imread('foto.jpg')
recorte = original[150:300, 200:400].copy()  # Recorta uma região
original[0:150, 0:200] = recorte              # Copia para o topo esquerdo

cv2.imshow('Imagem Modificada', original)
cv2.waitKey(0)
cv2.destroyAllWindows()

A separação e combinação de canais permitem manipular componentes individduais da imagem.

import cv2

img = cv2.imread('paisagem.png')
canal_azul, canal_verde, canal_vermelho = cv2.split(img)  # Separa os canais

# Processamento individual (exemplo: aumentar intensidade do azul)
canal_azul = cv2.add(canal_azul, 50)

imagem_combinada = cv2.merge([canal_azul, canal_verde, canal_vermelho])  # Recombina
cv2.imshow('Resultado', imagem_combinada)
cv2.waitKey(0)
cv2.destroyAllWindows()

A soma de imagens pode ser realizada de duas maneiras principais: com operador aritmético padrão (comportamento de módulo) ou com a função dedicada do OpenCV (saturação em 255).

import cv2
import numpy as np

img_a = cv2.imread('imagem1.bmp')
img_b = img_a.copy()  # Cria uma cópia

# Soma com operador + (resultados acima de 255 voltam a 0)
resultado_modulo = img_a + img_b

# Soma com cv2.add (resultados limitados a 255)
resultado_saturado = cv2.add(img_a, img_b)

cv2.imshow('Soma com Módulo', resultado_modulo)
cv2.imshow('Soma com Saturação', resultado_saturado)
cv2.waitKey(0)
cv2.destroyAllWindows()

A fusão de imagens pondera duas imagens com coeficientes e ajusta o brilho.

import cv2

fundo = cv2.imread('fundo.jpg')
objeto = cv2.imread('objeto.png')

# Garante que as imagens tenham o mesmo tamanho
altura, largura = fundo.shape[:2]
objeto_redimensionado = cv2.resize(objeto, (largura, altura))

# Fórmula: dst = α * img1 + β * img2 + γ
imagem_fundida = cv2.addWeighted(fundo, 0.7, objeto_redimensionado, 0.3, 0)

cv2.imshow('Imagem Fundida', imagem_fundida)
cv2.waitKey(0)
cv2.destroyAllWindows()

Conversões de espaço de cores são essenciais para tarefas como detecção de características.

import cv2

original = cv2.imread('foto_colorida.jpg', cv2.IMREAD_GRAYSCALE)  # Carrega como cinza
# Converte de cinza para BGR (preenche todos os canais iguais)
bgr_convertida = cv2.cvtColor(original, cv2.COLOR_GRAY2BGR)

cv2.imshow('Original em Cinza', original)
cv2.imshow('Convertida para BGR', bgr_convertida)
cv2.waitKey(0)
cv2.destroyAllWindows()

O espelhamento de imagens pode ser vertical, horizontal ou ambos.

import cv2

imagem = cv2.imread('retrato.jpg')
# flipCode: 0 = espelho vertical (eixo x), 1 = horizontal (eixo y), -1 = ambos
espelho_vertical = cv2.flip(imagem, 0)
espelho_horizontal = cv2.flip(imagem, 1)
espelho_ambos = cv2.flip(imagem, -1)

cv2.imshow('Espelho Vertical', espelho_vertical)
cv2.waitKey(0)
cv2.destroyAllWindows()

A segmantação por limiar transforma imagens em preto e branco com base em um valor de corte.

import cv2

imagem_cinza = cv2.imread('documento.png', cv2.IMREAD_GRAYSCALE)
limiar = 128
valor_maximo = 255

# Limiarização binária: pixels acima do limiar ficam brancos, abaixo pretos
_, resultado_binario = cv2.threshold(imagem_cinza, limiar, valor_maximo, cv2.THRESH_BINARY)

# Limiarização inversa para zero: pixels abaixo do limiar ficam pretos, acima mantêm valor original
_, resultado_inverso_zero = cv2.threshold(imagem_cinza, limiar, valor_maximo, cv2.THRESH_TOZERO_INV)

cv2.imshow('Limiarização Binária', resultado_binario)
cv2.imshow('Limiarização Inversa para Zero', resultado_inverso_zero)
cv2.waitKey(0)
cv2.destroyAllWindows()

Tags: OpenCV NumPy Python processamento de imagens Manipulação de Pixels

Publicado em 7-20 01:55