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()