#!/usr/bin/env python3
"""
Super aggressive yellow dot extraction from original image
"""
from PIL import Image, ImageEnhance
import numpy as np
import cv2

def super_aggressive_extract(image_path="Zard.jpg"):
    """Try everything to find yellow dots"""
    
    print(f"Loading {image_path}...")
    
    # Load with OpenCV for better control
    img_bgr = cv2.imread(image_path)
    img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)
    
    # Convert to float for processing
    img_float = img_rgb.astype(float) / 255.0
    
    # Enhance contrast first
    img_pil = Image.fromarray(img_rgb)
    enhancer = ImageEnhance.Contrast(img_pil)
    img_enhanced = enhancer.enhance(3.0)  # Increase contrast 3x
    img_enhanced_arr = np.array(img_enhanced).astype(float) / 255.0
    
    # Try multiple yellow extraction methods
    results = []
    
    # Method 1: HSV with very broad yellow range
    img_hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV)
    # Yellow hue range (OpenCV uses 0-180 for hue)
    lower_yellow = np.array([15, 30, 150])  # Broader range
    upper_yellow = np.array([45, 255, 255])
    mask_hsv = cv2.inRange(img_hsv, lower_yellow, upper_yellow)
    results.append(("HSV", mask_hsv))
    
    # Method 2: LAB color space
    img_lab = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2LAB)
    l, a, b_lab = cv2.split(img_lab)
    # Yellow: low a (greenish), high b (yellowish)
    mask_lab = ((a < 128) & (b_lab > 135) & (l > 150)).astype(np.uint8) * 255
    results.append(("LAB", mask_lab))
    
    # Method 3: RGB ratio - yellow has high R+G, low B
    r, g, b_rgb = cv2.split(img_bgr)
    yellow_score = (r.astype(float) + g.astype(float) - 2 * b_rgb.astype(float)) / 4
    threshold = np.percentile(yellow_score, 99.5)
    mask_rgb = (yellow_score > threshold).astype(np.uint8) * 255
    results.append(("RGB", mask_rgb))
    
    # Method 4: Enhanced image yellow extraction
    r_enh = img_enhanced_arr[:,:,0]
    g_enh = img_enhanced_arr[:,:,1]
    b_enh = img_enhanced_arr[:,:,2]
    yellow_enh = (r_enh + g_enh - 2*b_enh) / 4
    threshold_enh = np.percentile(yellow_enh, 99.5)
    mask_enh = (yellow_enh > threshold_enh).astype(np.uint8) * 255
    results.append(("Enhanced", mask_enh))
    
    # Combine all methods (OR operation)
    combined = np.zeros_like(mask_hsv)
    for name, mask in results:
        combined = cv2.bitwise_or(combined, mask)
        count = np.sum(mask > 0)
        print(f"{name:12s}: {count:8d} pixels")
    
    combined_count = np.sum(combined > 0)
    print(f"{'Combined':12s}: {combined_count:8d} pixels")
    
    # Save combined result
    cv2.imwrite('yellow_dots_combined.png', combined)
    print(f"\nSaved: yellow_dots_combined.png")
    
    # Apply morphological operations to clean up
    kernel = np.ones((3,3), np.uint8)
    cleaned = cv2.morphologyEx(combined, cv2.MORPH_CLOSE, kernel)
    cleaned = cv2.morphologyEx(cleaned, cv2.MORPH_OPEN, kernel)
    
    cv2.imwrite('yellow_dots_cleaned.png', cleaned)
    print(f"Saved: yellow_dots_cleaned.png")
    
    return cleaned

if __name__ == "__main__":
    result = super_aggressive_extract()
    
    # Now try DEDA on the result
    print("\nNow try running:")
    print("deda_parse_print yellow_dots_combined.png -d 300")
    print("deda_parse_print yellow_dots_cleaned.png -d 300")
