[PT]Script Python para corrigir automaticamente fotos subaquáticas

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

correction automatique photo sous-marine corail python opencv
Antes da correção com o script — Depois da correção

Por que esse método é utilizado em pesquisa

Ele corrige três problemas principais das imagens subaquáticas:

ProblemaCorreção
absorção do vermelhoRed Channel Compensation
dominante azul-verdeGray World
baixo contrasteCLAHE

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.


Si cet article vous a intéressé et que vous pensez qu'il pourrait bénéficier à d'autres personnes, n'hésitez pas à le partager sur vos réseaux sociaux en utilisant les boutons ci-dessous. Votre partage est apprécié !

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *