Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Boris 07. 01. 2019, 19:57:39
-
Počítám v pythonu vzájemnou euklidovskou vzdálenost RGBA dvou pixelů pomocí takové primitivní funkce (pro nepythonysty - ty dvě hvězdičky s dvojkou, to je nadruhou):
dist=math.sqrt(((r2-r1)**2)+((g2-g1)**2)+((b2-b1)**2)+((a2-a1)**2))
Je to stejné, jako když se měří vzdálenost, akorát že s barvičkama :)
Barvy pixelu jsou v rozmezí 0-255, takže maximální hodnota té funkce je sqrt(65025 * 4) = 510
Když tedy tu svoji funkci budu dělit těma 510, tak dostanu normalizovanou hodnotu v rozmezí 0.0 až 1.0.
No, a já si počítám z normalizované hodnoty novou barvičku tak, že tou normalizovanou hodnotou násobím 255.0, takže hodnota barvy by měla být v rozmezí 0 až 255. Upravená funkce tedy vypadá takto
dist=( ( math.sqrt(((r2-r1)**2)+((g2-g1)**2)+((b2-b1)**2)+((a2-a1)**2)) )/510.0) ) * 255.0
Dává Vám to smysl? Tak teď pozor:
Ten kód většinou funguje, až narazí na situaci, kdy jeden pixel je (0,0,0,86) a druhý (0,0,0,89). Bude to tedy zjednodušeně
(Math.sqrt(3**2)/510.0)*255.0
(3/510.0)*255.0
a to se rovná 1.49999999999
A to je divné! Jak to může být víc než jedna?! Teda, já vím, že /510 * 255 je skoro to samý jako *0.5,
aritmeticky to samozřejmě může být jen dobře, ptám se, kde je díra v mém postupu, protože mě to připadá naprosto košer.
-
Proč vám přpadá divně, že je to víc než 1?
-
(Math.sqrt(3**2)/510.0)*255.0
(3/510.0)*255.0
3*255.0/510.0
765.0/510.0
1.5
Výsledek je správně. Doporučuji nejprve násobit a teprve pak dělit.
-
Vždyť to máte v pořádku, výsledek 1.5 je v požadovaném intervalu 0-255...
asi nechlastat tolik, anebo chlastat víc... 8)
-
Máte pravdu, je to dobře ;D už s tím pro dnešek raději skončím.
Díky moc
-
už s tím pro dnešek raději skončím.
S chlastem?
-
Takhle to dopadá, když se netrefí Ballmer Peak.
(https://imgs.xkcd.com/comics/ballmer_peak.png)
-
Vždyť to máte v pořádku, výsledek 1.5 je v požadovaném intervalu 0-255...
asi nechlastat tolik, anebo chlastat víc... 8)
0-255 = -255. To nie je ziadny interval a 1,5 je uplne inde.
-
0-255 = -255. To nie je ziadny interval a 1,5 je uplne inde.
Tak určitě...