Skip to content

Realce de Cristas

O RidgeEnhancer é a quinta etapa do pipeline. Transforma o ROI do dedo em uma imagem 500x500 com cristas papilares realçadas e fundo uniforme.

Algoritmo

1. Subtração de Background

Remove variações de iluminação usando um modelo de fundo gaussiano:

python
# Modelo de iluminação (blur forte)
background = cv2.GaussianBlur(roi_gray, (0, 0), sigmaX=30.0)

# Subtrair e normalizar
normalized = cv2.subtract(roi_gray, background)
normalized = cv2.normalize(normalized, None, 0, 255, cv2.NORM_MINMAX)

Isso equaliza a iluminação — compensando sombras, gradientes e reflexos.

2. Primeiro CLAHE (Agressivo)

CLAHE (Contrast Limited Adaptive Histogram Equalization) realça contraste localmente:

python
clahe1 = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(8, 8))
enhanced = clahe1.apply(normalized)
  • clipLimit=3.0: Agressivo — maximiza contraste das cristas
  • tileGridSize=8×8: Blocos menores para adaptação local fina

3. Filtro Bilateral

Suaviza ruído preservando bordas (as cristas papilares):

python
enhanced = cv2.bilateralFilter(enhanced, d=5, sigmaColor=50, sigmaSpace=50)

O filtro bilateral é ideal para digitais porque mantém as transições nítidas entre cristas e vales enquanto suaviza ruído de textura.

4. Segundo CLAHE (Suave)

Refinamento final com CLAHE mais brando:

python
clahe2 = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(16, 16))
enhanced = clahe2.apply(enhanced)
  • clipLimit=2.0: Suave — refina sem over-enhance
  • tileGridSize=16×16: Blocos maiores para uniformidade global

5. Máscara Convexa

Limpa a borda usando o convex hull da máscara do dedo:

python
hull = cv2.convexHull(contour)
hull_mask = cv2.drawContours(np.zeros_like(roi_mask), [hull], -1, 255, -1)
enhanced[hull_mask == 0] = bg_value  # background = cinza 60

6. Canvas 500x500

Centraliza a imagem processada em um canvas quadrado:

python
# Escalar mantendo aspect ratio (max dimension = 500 - 20px padding)
scale = (500 - 20) / max(h, w)
resized = cv2.resize(enhanced, None, fx=scale, fy=scale)

# Centralizar em canvas 500x500 com fundo cinza
canvas = np.full((500, 500), 60, dtype=np.uint8)
y_off = (500 - resized.shape[0]) // 2
x_off = (500 - resized.shape[1]) // 2
canvas[y_off:y_off+resized.shape[0], x_off:x_off+resized.shape[1]] = resized

Parâmetros

ParâmetroPadrãoEfeito
bg_blur_sigma30.0Sigma do blur de fundo — maior = mais suavização
clahe1_clip3.0Clip limit do CLAHE agressivo
clahe1_grid(8, 8)Grid do CLAHE agressivo
clahe2_clip2.0Clip limit do CLAHE suave
clahe2_grid(16, 16)Grid do CLAHE suave
bilateral_d5Diâmetro do filtro bilateral
bilateral_sigma_color50Sensibilidade a cor
bilateral_sigma_space50Sensibilidade espacial
canvas_size500Tamanho da imagem de saída
bg_value60Valor do fundo (cinza)

Pipeline Visual

ROI (grayscale)

    ▼  Subtração de background (σ=30)
Normalizado

    ▼  CLAHE (clip=3.0, grid=8×8)
Alto contraste

    ▼  Bilateral (d=5, σ=50)
Suavizado

    ▼  CLAHE (clip=2.0, grid=16×16)
Refinado

    ▼  Convex hull mask + canvas
500×500 final

Valid S.A. - Soluções de Identidade Digital