File size: 3,186 Bytes
8da7bdd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import pytest
import numpy as np
from src.preprocessing import (
    synchronize_polarity,
    preprocess_for_matching,
    is_informative_region,
    filter_informative_proposals
)

def test_synchronize_polarity():
    # Drawing và template cùng nền trắng nét đen -> giữ nguyên
    d1 = np.ones((50, 50), dtype=np.uint8) * 255
    t1 = np.ones((10, 10), dtype=np.uint8) * 255
    d1_sync, t1_sync = synchronize_polarity(d1, t1)
    assert d1_sync.mean() > 128 and t1_sync.mean() > 128
    
    # Drawing ngược màu (nền tối), template nền sáng -> Invert drawing
    d2 = np.zeros((50, 50), dtype=np.uint8)
    d2_sync, t2_sync = synchronize_polarity(d2, t1)
    assert d2_sync.mean() > 128
    assert t2_sync.mean() > 128

def test_synchronize_polarity_both_dark():
    # Cả hai đều nền tối -> Đồng bộ hóa phải giữ cho cả hai cùng pha
    d = np.zeros((50, 50), dtype=np.uint8)
    t = np.zeros((10, 10), dtype=np.uint8)
    d_sync, t_sync = synchronize_polarity(d, t)
    assert (d_sync.mean() > 128) == (t_sync.mean() > 128)

def test_is_informative_region():
    # Vùng đồng nhất màu trắng tinh -> False
    blank = np.ones((30, 30), dtype=np.uint8) * 255
    assert not is_informative_region(blank, std_threshold=5.0)
    
    # Vùng chứa nét vẽ đen -> True
    nontrivial = np.ones((30, 30), dtype=np.uint8) * 255
    nontrivial[10:20, 10:20] = 0
    assert is_informative_region(nontrivial, std_threshold=5.0)

def test_filter_informative_proposals(dummy_grayscale_drawing):
    # Giả lập proposals dạng (x, y, w, h, score, scale)
    proposals = [
        (10, 10, 30, 30, 0.9, 1.0),  # Vùng trắng tinh (nền)
        (50, 50, 50, 50, 0.8, 1.0)   # Vùng chứa nét vẽ chữ nhật
    ]
    
    filtered = filter_informative_proposals(proposals, dummy_grayscale_drawing, std_threshold=5.0)
    # Vùng trắng ở (10, 10) bị lọc đi, chỉ giữ lại vùng (50, 50)
    assert len(filtered) == 1
    assert filtered[0][0] == 50

def test_preprocess_for_matching():
    img = np.ones((50, 50), dtype=np.uint8) * 255
    img[10:40, 20:30] = 0
    
    # Kiểm tra kiểu đầu ra của dilated_edge
    edges = preprocess_for_matching(img, method="dilated_edge")
    assert edges.max() > 0
    assert edges.dtype == np.uint8
    assert edges.shape == (50, 50)
    
    # Kiểm tra method không hợp lệ -> Trả lại raw image silently
    raw = preprocess_for_matching(img, method="invalid_method")
    assert np.array_equal(raw, img)

def test_preprocess_for_matching_multichannel():
    # Test BGR image
    img_bgr = np.ones((50, 50, 3), dtype=np.uint8) * 255
    img_bgr[10:40, 20:30, :] = 0
    edges_bgr = preprocess_for_matching(img_bgr, method="dilated_edge")
    assert edges_bgr.max() > 0
    assert edges_bgr.ndim == 2
    assert edges_bgr.shape == (50, 50)
    
    # Test RGBA image
    img_rgba = np.ones((50, 50, 4), dtype=np.uint8) * 255
    img_rgba[10:40, 20:30, :3] = 0 # keep alpha channel 255
    edges_rgba = preprocess_for_matching(img_rgba, method="dilated_edge")
    assert edges_rgba.max() > 0
    assert edges_rgba.ndim == 2
    assert edges_rgba.shape == (50, 50)