-
Ternární operátor v Pythonu
L_proj = img_proj.width if img_proj.height == 1 else img_proj.height
To je jednovětvý zápis pro:
if img_proj.height == 1: L_proj = img_proj.width else: L_proj = img_proj.height
Znamená to „pokud je výsledný obrázek řádková projekce (výška == 1), vezmi jeho šířku, jinak (sloupcová projekce) vezmi jeho výšku“.
-
getdata()
pixels = list(img_proj.getdata())
-
img_proj.getdata()
vrací iterovatelný proud všech pixelů obrázkuimg_proj
, hodnoty 0–255 (pro režim'L'
). -
Zápisem
list(…)
to naházíme do Python-listu, takže máme pevné pole[p0, p1, …, pN]
.
-
-
Korekce zředění podle změny délky
255 DĚLENO (max−min)
Když redukujete řadu o délceL_orig
na projekci délkyL_proj
, každý pixel nové projekce "shrne" ≈L_orig/L_proj
původních bodů. Abychom tam kompenzovali tu ztrátu kontrastu, násobíme standardní normalizační faktorještě faktorem délky
Lorig DĚLENO Lprojdohromady:
length_scale = original_length / L_proj inten_scale = 255.0 / (mx - mn) scale = inten_scale * length_scale
Tím obnovíme šedé odstíny zhruba na úroveň původního detailu.
def normalize_projection_manual(img_proj: Image.Image, original_length: int) -> tuple[Image.Image, float, int]:
"""
Lineárně přepočte 1D projekci (L režim, size=(w,1) nebo (1,h)) tak,
že původní min → 0 a původní max → 255, kompenzuje zředění dle změny velikosti.
Parametry:
img_proj – PIL.Image v režimu 'L', délky L_proj (1D).
original_length – délka před resize (např. šířka nebo výška cropu).
Návrat:
img_norm – nový Image ‚L‘
scale – škálovací faktor zohledňující both intensity a length: (255/(mx–mn)) * (original_length/L_proj)
offset – původní min, který byl „odečten“
"""
# 1) Jednorozměrná délka projekce
L_proj = img_proj.width if img_proj.height == 1 else img_proj.height
# 2) Data a min/max
pixels = list(img_proj.getdata())
mn, mx = min(pixels), max(pixels)
if mx == mn:
return img_proj.copy(), 1.0, mn
# 3) Intenzitní faktor
inten_scale = 255.0 / (mx - mn)
# 4) Korekce zředění podle délky
length_scale = original_length / L_proj
scale = inten_scale * length_scale
offset = mn
# 5) LUT pro rychlou aplikaci
lut = [min(255, max(0, int((i - offset) * scale))) for i in range(256)]
# 6) Aplikace
img_norm = img_proj.point(lut)
img_norm.scale = scale
img_norm.offset = offset
return img_norm, scale, offset
Žádné komentáře:
Okomentovat