import cv2
import numpy as np
import os

base_dir = "/home/tuan-nguyen/.openclaw/workspace/010-pali-thaykha"
input_png = os.path.join(base_dir, "page_14_raw-14.png")

img = cv2.imread(input_png, cv2.IMREAD_GRAYSCALE)
print(f"📐 Ảnh gốc: {img.shape[1]}x{img.shape[0]} px")

# Bilateral filter giữ nguyên
filtered = cv2.bilateralFilter(img, d=9, sigmaColor=75, sigmaSpace=75)

def process_and_save(name, block_size, C, morph_kernel_size, extra_blur=False):
    work = filtered.copy()

    # Optional: median blur nhẹ để diệt đốm nhỏ trước khi threshold
    if extra_blur:
        work = cv2.medianBlur(work, 3)

    thresh = cv2.adaptiveThreshold(
        work, 255,
        cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
        cv2.THRESH_BINARY,
        block_size, C
    )

    # Morphology: kernel lớn hơn để xóa đốm đen
    if morph_kernel_size > 1:
        kernel = np.ones((morph_kernel_size, morph_kernel_size), np.uint8)
        thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)

    out_path = os.path.join(base_dir, name)
    cv2.imwrite(out_path, thresh)

    # Đếm đốm đen nhỏ (connected components nhỏ hơn 10px)
    _, binary = cv2.threshold(thresh, 127, 255, cv2.THRESH_BINARY_INV)
    n_labels, labels, stats, _ = cv2.connectedComponentsWithStats(binary, connectivity=8)
    small_dots = sum(1 for i in range(1, n_labels) if stats[i, cv2.CC_STAT_AREA] < 10)
    total_dots = n_labels - 1

    size_kb = os.path.getsize(out_path) / 1024
    print(f"✅ {name} | C={C} b={block_size} morph={morph_kernel_size}x{morph_kernel_size} blur={extra_blur} | {size_kb:.0f}KB | đốm nhỏ: {small_dots}/{total_dots}")
    return thresh

# ===== 6 biến thể: C cao hơn + morphology mạnh hơn =====
tests = [
    ("pg14_C25_b21_m2.png",         21, 25, 2, False,  "C=25, morph 2x2"),
    ("pg14_C28_b21_m2.png",         21, 28, 2, False,  "C=28, morph 2x2"),
    ("pg14_C25_b23_m2.png",         23, 25, 2, False,  "C=25, block=23, morph 2x2"),
    ("pg14_C22_b21_m3.png",         21, 22, 3, False,  "C=22, morph 3x3 (diệt đốm mạnh)"),
    ("pg14_C25_b21_m3.png",         21, 25, 3, False,  "C=25, morph 3x3"),
    ("pg14_C25_b21_m2_blur.png",    21, 25, 2, True,   "C=25, morph 2x2 + medianBlur"),
]

print("\n🔬 So sánh đốm đen nhỏ (<10px):\n")

for fname, bs, c, mk, blur, desc in tests:
    print(f"  {desc} → ", end="")
    process_and_save(fname, bs, c, mk, extra_blur=blur)

# Bonus: đếm đốm trên bản C=22 gốc để so sánh
print("\n📊 Baseline (C=22_b21 cũ):")
orig = cv2.imread(os.path.join(base_dir, "cleaned_page14_C22_b21.png"), cv2.IMREAD_GRAYSCALE)
_, binary = cv2.threshold(orig, 127, 255, cv2.THRESH_BINARY_INV)
n_labels, labels, stats, _ = cv2.connectedComponentsWithStats(binary, connectivity=8)
small_dots = sum(1 for i in range(1, n_labels) if stats[i, cv2.CC_STAT_AREA] < 10)
print(f"  đốm nhỏ: {small_dots}/{n_labels-1}")
