process_images()
└─ for each image:
├─ create_thumbnail_with_regions()
│ ├─ binarize_shadow() → bl_bw, tr_bw
│ ├─ locate_region_and_source()
│ │ └─ project_and_find_shadow_ranges()
│ │ ├─ normalize_projection_manual(row_proj)
│ │ ├─ find_intervals(vals, ShadowType)
│ │ ├─ normalize_projection_manual(col_proj)
│ │ └─ find_intervals(vals, ShadowType)
│ └─ return bl_small, bl_crop, tr_small, tr_crop, thumbnail, bl_box, tr_box
├─ locate_region_and_source(bl_bw, tr_bw, bl_crop, tr_crop, …)
└─ detect_angle_from_crops(bl_small, bl_crop, tr_small, tr_crop, thumbnail, full_img, bl_box, tr_box)
Pipeline volání
-
create_thumbnail_with_regions(img, output_path, regions, estimated_dpi, debug_simulate_shadow)
└─best_divisor(width, height, estimated_dpi)
└─ resize →thumbnail
└─get_dimensions_for_cropped_areas(regions, thumbnail_size, divisor)
→bl_box
,tr_box
└─ crop →bl_crop
,tr_crop
└─compute_small_image_and_divisor(bl_crop, est_shadow_thumb_px)
→bl_small
,bl_div
└─compute_small_image_and_divisor(tr_crop, est_shadow_thumb_px)
→tr_small
,tr_div
└─binarize_shadow(bl_small)
→bl_bw
└─binarize_shadow(tr_small)
→tr_bw
└─ ifdebug_simulate_shadow
:simulate_and_measure_thresholds(region_size, debug_folder, label, best_divisor, div_factor, orientations)
-
locate_region_and_source(bl_bw, tr_bw, bl_crop, tr_crop, thumbnail, full_img, bl_box, tr_box, bl_div, tr_div, small_capacity_bl, small_capacity_tr, est_shadow_thumb_px, output_path)
└─project_and_find_shadow_ranges(bl_bw, tr_bw, …, output_path)
│ └─ for("small_bl", bl_bw)
and("small_tr", tr_bw)
:
│ └─ resize →row_proj
,col_proj
│ └─normalize_projection_manual(row_proj, w)
→img_norm
,scale
,offset
│ └─find_intervals(vals, ShadowType.DARK|GRAY)
→*_dark_row
,*_gray_row
│ └─normalize_projection_manual(col_proj, h)
→img_norm
,scale
,offset
│ └─find_intervals(vals, ShadowType.DARK|GRAY)
→*_dark_col
,*_gray_col
│ └─intersect_intervals(row_intervals, col_intervals, ShadowType.DARK|GRAY)
→*_regions_dark
,*_regions_gray
│ └─ save regions indebugging_bl
/debugging_tr
│ └─ returnresults
└─ computekapacita_small_bl
,kapacita_small_tr
,kapacita_thumbnail
└─ appendcandidates
in order small_bl, small_tr, crop_bl, crop_tr, thumbnail, full
└─ return{"candidates": …}
,resolution_info
-
detect_angle_from_crops(bl_small, bl_crop, tr_small, tr_crop, thumbnail, full_img, bl_box, tr_box)
└─ compute capacities
└─ in order small_bl → small_tr → crop_bl → crop_tr → thumbnail → full:
│ └─measure_angle_and_length(crop_img, threshold_px)
→angle
,length
│ └─ ifangle
found → computeregion
→ return result dict
└─ return last result or fallback withangle=None
TABULKA S VYSVĚTLENÍM
Proměnná | Vypočítává/definuje se v | Používá se v | Vysvětlení použití | Vazba a konzistence |
---|---|---|---|---|
divisor |
create_thumbnail_with_regions |
tamtéž |
Dělí originální rozměry (width , height ) pro zmenšení na thumbnail . |
Volí se tak, aby výsledný DPI thumbnailu byl blízko cílových 300 dpi → ovlivňuje všechny další úrovně. |
scale_factor |
create_thumbnail_with_regions |
tamtéž |
Poměr new_width/width = 1/divisor ; škáluje souřadnice regionů z originálu do thumbnailu. |
Je přesně obrácenou hodnotou divisor (v reálných pixelech) → zajišťuje korektní překlad oblastí. |
bl_div / tr_div |
create_thumbnail_with_regions |
tamtéž + simulate_and_measure_thresholds |
Dělí bl_crop a tr_crop pro vytvoření „small“ obrázků (bl_small , tr_small ). |
bl_div , tr_div by měly být stejné řády jako divisor (např. ∼10) pro konzistentní zmenšování věrné DPI. |
scale (normalizace) |
normalize_projection_manual |
project_and_find_shadow_ranges , simulate_and_measure_thresholds |
Kompenzuje jak intenzitu (255/(mx–mn) ), tak zředění (original_length/L_proj ) po projekci. |
Závisí na poměru původní délky řady/sloupce k délce po resize → zajišťuje konzistentní prahování stínu. |
offset (normalizace) |
normalize_projection_manual |
project_and_find_shadow_ranges , simulate_and_measure_thresholds |
Posun původního minima, které bylo „odečteno“ při normalizaci. | Společně se scale vytváří konzistentní mapování původních intenzit na [0–255] i napříč různými velikostmi. |
POZNÁMKY:
"Zředění" - zředění je zjednodušující výraz pro vedlejší efekt projekce, kdy se intenzity šedi při zmenšení na jednorozměrné pole zprůměrují, a šedá nebo černá vybledne.
Normalizace (po projekci do 1D obrazu): Míra zesílení intenzit v obrazu je závislá na tom jak moc se původní strana zmenšila a taky na tom jaká je minimální a maximální hodnota intenzity v tom obrazu.
Normalizace pak dvoufázově kompenzuje:
1. intenzitu – škála = 255/(max–min), aby nejtmavší byl → 0 a nejsvětlejší byl → 255,
2. zředění – násobek = (původní délka)/(délka projekce), čímž se vyrovná efekt průměrování přes různý počet pixelů.
Společně scale = (255/(mx–mn)) × (original_length/L_proj)
a offset = mn
zajistí, že 1D obraz vrátí správné relativní rozložení stínu nezávisle na tom, jak moc byl zmenšený.
Úskalí po normalizaci
Poté co byla provedena normalizace 1D obrazu, už neplatí, že by barvy stínu, které byly vizuálně přečteny z původního small náhledu (např. v grafickém editoru), byly totožné s nově vygenerovaným stínem normalizovaného souboru. K tomu by bylo nutné provést přepočet nebo test. Takže pro nalezení hranic šedi jak definuje třída:
class ShadowRanges(Enum):
DARK_MAX = 188
GRAY_MIN = 189
GRAY_MAX = 232
BLACK = 0
WHITE = 255
by bylo nutné použít přepočet. Pro ověření funkce pro přepočet a doladění nastavení scriptu vzniká funkce pro simulaci.
Žádné komentáře:
Okomentovat