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 cristastileGridSize=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-enhancetileGridSize=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 606. 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]] = resizedParâmetros
| Parâmetro | Padrão | Efeito |
|---|---|---|
bg_blur_sigma | 30.0 | Sigma do blur de fundo — maior = mais suavização |
clahe1_clip | 3.0 | Clip limit do CLAHE agressivo |
clahe1_grid | (8, 8) | Grid do CLAHE agressivo |
clahe2_clip | 2.0 | Clip limit do CLAHE suave |
clahe2_grid | (16, 16) | Grid do CLAHE suave |
bilateral_d | 5 | Diâmetro do filtro bilateral |
bilateral_sigma_color | 50 | Sensibilidade a cor |
bilateral_sigma_space | 50 | Sensibilidade espacial |
canvas_size | 500 | Tamanho da imagem de saída |
bg_value | 60 | Valor 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