User:
Jasně že to nestačí, protože kurva nebudu spouštět algoritmus na hledání nějaké pojebané čáry na celý obraz nascanovaný v 300dpi A4! "Proč region=(0, 0, *image.size) je špatně? To je jen fallback, nouzový začátek – říká: “Celý obrázek je kandidátní oblast”" To určitě. RE: "Chceš, abych ti upravil tu funkci tak, aby dělala přesně tohle – tedy omezila každý kandidát jen na jeho reálný detekovaný rozsah podle shadow_ranges?"
AI:
Upravil jsem locate_region_and_source
, aby nejprve zavolala project_and_find_shadow_ranges
, získala pro bl_small
/tr_small
konkrétní intervaly a pak podle nich sestavila kandidáty s přesnými regiony (přepočtenými na příslušné měřítko). Zde je nová verze funkce:
def locate_region_and_source(
bl_small: Image.Image,
tr_small: Image.Image,
bl_crop: Image.Image,
tr_crop: Image.Image,
thumbnail: Image.Image,
full_img: Image.Image,
bl_box_in_thumb: tuple,
tr_box_in_thumb: tuple,
crop_resize_bl_factor: int,
crop_resize_tr_factor: int,
small_capacity_bl: int,
small_capacity_tr: int,
est_shadow_thumb_px: int
) -> tuple[dict, dict]:
"""
Vrátí:
- {'candidates': [...]}, kde každý kandidát má přesně vypočtený region
- resolution_info s kapacitami
"""
# 1) Normy
MIN_SHADOW_PX_SMALL = 4
SHADOW_PX_THUMB = 8
# 2) Kapacity
kap_small_bl = bl_small.height // MIN_SHADOW_PX_SMALL
kap_small_tr = tr_small.height // MIN_SHADOW_PX_SMALL
kap_thumb = thumbnail.height // SHADOW_PX_THUMB
resolution_info = {
"kapacita_small_bl": kap_small_bl,
"kapacita_small_tr": kap_small_tr,
"kapacita_thumbnail": kap_thumb,
}
# 3) Zúžení regionu pomocí 1D projekcí
shadow_ranges = project_and_find_shadow_ranges(
bl_bw=bl_small,
tr_bw=tr_small,
min_shadow_thickness_px=MIN_SHADOW_PX_SMALL,
min_shadow_length_px=20,
intensity_thresh=0.5,
prefix="" # nebo použij output_path, pokud chceš názvy souborů
)
# shadow_ranges obsahuje např.:
# 'bl_row': (x1, x2, length), 'bl_col': (y1, y2, length), atd.
candidates = []
# 4) small_bl
r1, r2, _ = shadow_ranges["bl_row"]
c1, c2, _ = shadow_ranges["bl_col"]
if r1 is not None and c1 is not None and kap_small_bl >= kap_thumb:
candidates.append({
"source": "small_bl",
"image": bl_small,
"region": (r1, c1, r2 + 1, c2 + 1) # +1, protože end je včetně
})
# 5) small_tr
r1, r2, _ = shadow_ranges["tr_row"]
c1, c2, _ = shadow_ranges["tr_col"]
if r1 is not None and c1 is not None and kap_small_tr >= kap_thumb:
candidates.append({
"source": "small_tr",
"image": tr_small,
"region": (r1, c1, r2 + 1, c2 + 1)
})
# 6) crop_bl — přepočtené z small na crop
if bl_crop.height >= SHADOW_PX_THUMB:
# region v bl_small byl (r1,c1,r2,c2), nyní násobíme bl_box v thumb a faktor
x1 = bl_box_in_thumb[0] + r1 * crop_resize_bl_factor
y1 = bl_box_in_thumb[1] + c1 * crop_resize_bl_factor
x2 = bl_box_in_thumb[0] + (r2 + 1) * crop_resize_bl_factor
y2 = bl_box_in_thumb[1] + (c2 + 1) * crop_resize_bl_factor
candidates.append({
"source": "crop_bl",
"image": bl_crop,
"region": (x1, y1, x2, y2)
})
# 7) crop_tr
if tr_crop.height >= SHADOW_PX_THUMB:
x1 = tr_box_in_thumb[0] + r1 * crop_resize_tr_factor
y1 = tr_box_in_thumb[1] + c1 * crop_resize_tr_factor
x2 = tr_box_in_thumb[0] + (r2 + 1) * crop_resize_tr_factor
y2 = tr_box_in_thumb[1] + (c2 + 1) * crop_resize_tr_factor
candidates.append({
"source": "crop_tr",
"image": tr_crop,
"region": (x1, y1, x2, y2)
})
if not candidates:
return None, resolution_info
Tímto způsobem každý kandidát obsahuje přesný ořez, nikoli celý obraz. Konkrétní souřadnice se přepočítají zpět na příslušné rozlišení (crop_resize_*_factor
) a dají se rovnou použít pro Houghovu transformaci.
Žádné komentáře:
Okomentovat