File size: 2,915 Bytes
e47c691
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
"""

Standard Grid Processor (Final / Perfect).

Uses Spectral Separation + Correct Polarity (Black Ink).

"""
import cv2
import numpy as np
import sys
from pathlib import Path

sys.path.insert(0, str(Path(__file__).resolve().parent / 'src'))
from vectorizer import CharacterVectorizer
from font_generator import generate_font

def get_page_transform(img):
    # Simplified alignment - Find page if possible, else full image
    h, w = img.shape[:2]
    return np.array([[0,0], [2480,0], [2480,3508], [0,3508]], dtype="float32") # Fallback to full A4

def process_grid_final(image_path, output_font="outputs/PerfectAIFont.ttf", font_family_name="PerfectAIFont"):
    print(f"Processing: {image_path}")
    img = cv2.imread(image_path)
    if img is None:
        raise ValueError("Cannot open image")
    
    # Resize to A4
    img = cv2.resize(img, (2480, 3508))
    
    # 1. AI Extraction (Blue Ink -> White Mask)
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    s = hsv[:, :, 1]
    _, mask = cv2.threshold(s, 50, 255, cv2.THRESH_BINARY)
    
    # 2. Polarity Fix (White Mask -> Black Ink on White BG)
    # This matches "Option B" which was confirmed correct
    final_mask = cv2.bitwise_not(mask)
    
    # Clean noise
    kernel = np.ones((3,3), np.uint8)
    final_mask = cv2.morphologyEx(final_mask, cv2.MORPH_OPEN, kernel) # Remove small noise
    
    # 3. Grid Extraction
    margin_x, margin_y = 100, 300
    cols = 8
    cell_w = (2480 - 2 * margin_x) // cols
    cell_h = int(cell_w * 1.2)
    
    chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!?.,:;"
    
    current_x, current_y = margin_x, margin_y
    vectorizer = CharacterVectorizer()
    char_paths = {}
    
    print("Vectorizing...")
    for i, char in enumerate(chars):
        x1, y1 = int(current_x), int(current_y)
        x2, y2 = int(x1 + cell_w), int(y1 + cell_h)
        
        pad = 20
        roi = final_mask[y1+pad:y2-pad, x1+pad:x2-pad]
        
        # Check original mask for content (White ink)
        roi_check = mask[y1+pad:y2-pad, x1+pad:x2-pad]
        
        if cv2.countNonZero(roi_check) > 50:
            path, _ = vectorizer.vectorize(roi)
            if path:
                char_paths[char] = path
                print(f"  {char}: Found")
        
        current_x += cell_w
        if (i + 1) % cols == 0:
            current_x = margin_x
            current_y += cell_h
            
    generate_font(char_paths, output_font, font_family_name)
    print(f"Success! Saved to {output_font}")

if __name__ == "__main__":
    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument("image", help="Input image")
    parser.add_argument("-o", "--output", default="outputs/PerfectAIFont.ttf")
    args = parser.parse_args()
    process_grid_final(args.image, args.output)