Debaixo d’água, os diferentes comprimentos de onda da luz são progressivamente absorvidos: o vermelho desaparece primeiro, seguido pelo laranja e pelo amarelo. Mesmo em águas rasas, as fotos frequentemente apresentam uma dominante azul-ciano. Como resultado, as imagens parecem azuladas ou esverdeadas e os corais perdem suas cores naturais. Felizmente, isso pode ser corrigido com relativa facilidade.
Em águas rasas (<2–3 m), a perda do vermelho é limitada, mas a imagem costuma ser dominada por tons azul/ciano.
Para um processamento automático (por exemplo antes de usar ferramentas CoralReef), a melhor abordagem é:
- balanço de branco automático
- leve reforço do canal vermelho
- redução do canal azul
- aumento do contraste
Isso pode ser feito facilmente com Python + OpenCV em um diretório inteiro de imagens.
No processamento científico de imagens subaquáticas, várias técnicas de visão computacional são frequentemente utilizadas:
- Gray World / balanço de branco adaptativo
- Red Channel Compensation (RCC) para reconstruir o vermelho perdido
- CLAHE (Contrast Limited Adaptive Histogram Equalization)
- às vezes Retinex para correção da iluminação
Essa combinação é utilizada em diversos trabalhos de pesquisa sobre recifes de coral e robótica subaquática.
Aqui proponho um script Python robusto que aplica:
1️⃣ compensação do canal vermelho
2️⃣ balanço de branco Gray-World
3️⃣ melhoria de contraste (CLAHE)
4️⃣ processamento em lote de um diretório
Esse método é significativamente mais eficiente do que scripts simples.
Script Python
Este script:
- lê todas as imagens de um diretório
- corrige o balanço de branco
- reequilibra os canais de cor
- salva as imagens corrigidas em um novo diretório
import cv2
import numpy as np
import os
from pathlib import Path
input_dir = "photos_brutes"
output_dir = "photos_corrigees"
Path(output_dir).mkdir(exist_ok=True)
# -----------------------------
# Red Channel Compensation
# -----------------------------
def red_channel_compensation(img):
b,g,r = cv2.split(img)
b_mean = np.mean(b)
g_mean = np.mean(g)
r = r + (g_mean - np.mean(r))*0.6
r = r + (b_mean - np.mean(r))*0.3
r = np.clip(r,0,255)
return cv2.merge([b,g,r.astype(np.uint8)])
# -----------------------------
# Gray World White Balance
# -----------------------------
def gray_world(img):
img = img.astype(np.float32)
avg_b = np.mean(img[:,:,0])
avg_g = np.mean(img[:,:,1])
avg_r = np.mean(img[:,:,2])
avg = (avg_b + avg_g + avg_r) / 3
img[:,:,0] *= avg/avg_b
img[:,:,1] *= avg/avg_g
img[:,:,2] *= avg/avg_r
img = np.clip(img,0,255)
return img.astype(np.uint8)
# -----------------------------
# CLAHE Contrast Enhancement
# -----------------------------
def enhance_contrast(img):
lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
l,a,b = cv2.split(lab)
clahe = cv2.createCLAHE(clipLimit=2.5, tileGridSize=(8,8))
l = clahe.apply(l)
lab = cv2.merge((l,a,b))
return cv2.cvtColor(lab, cv2.COLOR_LAB2BGR)
# -----------------------------
# Pipeline complet
# -----------------------------
def process(img):
img = red_channel_compensation(img)
img = gray_world(img)
img = enhance_contrast(img)
return img
# -----------------------------
# Batch processing
# -----------------------------
for file in os.listdir(input_dir):
if file.lower().endswith((".jpg",".jpeg",".png",".tif",".tiff")):
path = os.path.join(input_dir,file)
img = cv2.imread(path)
if img is None:
print("image ignorée:", file)
continue
corrected = process(img)
outpath = os.path.join(output_dir,file)
cv2.imwrite(outpath,corrected)
print("processed:",file)
print("Terminé")
Instalação
Em uma janela OSGeo4W shell:
pip install opencv-python numpy
Estrutura dos diretórios
projeto/
script.py
fotos_brutas/
img1.jpg
img2.jpg
fotos_corrigidas/
Antes / Depois da correção
Por que esse método é utilizado em pesquisa
Ele corrige três problemas principais das imagens subaquáticas:
| Problema | Correção |
|---|---|
| absorção do vermelho | Red Channel Compensation |
| dominante azul-verde | Gray World |
| baixo contraste | CLAHE |
Resultados:
- cores mais naturais
- texturas de coral mais visíveis
- segmentação automática mais estável
Isso é muito útil para ferramentas de análise de recifes de coral.
Por que este script funciona bem com CoralReef
Ferramentas de análise de recifes geralmente utilizam:
- segmentação por cor
- classificação de corais
O script melhora:
- a separação coral / água
- a visibilidade das texturas
- a consistência das cores
o que pode melhorar a detecção automática.
Nota
Se as imagens forem feitas em profundidade muito baixa (~1 m), você pode reduzir ligeiramente a compensação do vermelho:
r = r + (g_mean - np.mean(r))*0.4
Este script Python pode ser utilizado como etapa de pré-processamento de imagens para análise automática de recifes de coral, por exemplo antes do uso de ferramentas de classificação ou segmentação.
