Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Jméno 05. 03. 2016, 00:13:12

Název: Použití numpy.extract s podmínkou
Přispěvatel: Jméno 05. 03. 2016, 00:13:12
Ako pouzit funkciu extract z kniznice numpy v taktomto pripade? Pouzivam python 2.

Dane su dve ndarray polia img[riadok][stlpec][rgb_zlozka] zodpovedajuce nejakemu obrazu a alfa[riadok][stlpec] pole s hodnotami "priehladnosti". Pre kazdu z uvazovanych hodnot alfa by som potreboval dostat zoznam rgb trojic z obrazu, ktore jej prisluchaju. Pokusal som sa to urobit takto:

numpy.extract(numpy.equal(ALFA_HODNOTA, alfa), img).reshape((-1, 3))

Problem je vsak to, ze to python to spracuje ako 1D polia, tzn. hodnota alfa[0][0] je sparovana s img[0][0][0], alfa[0][1] s img[0][0][1], alfa[0][2] s img[0][0][2]... potreboval by som aby alfa[0][0] bola sparovana s img[0][0], alfa[0][1] s img[0][1], alfa[0][2] s img[0][2] atd. Vysledkom teda je pole, ktore obsahuje rovnaky pocet prvkov ako ma pole alfa a prvkami su zlozky rgb trojic, nie rgb trojice. Kedze sa prvky spracuvaju po jednom alfa pokryva len prvu tretinu RGB zloziek obrazu. Existuje nejake lelegantnejsie riesenie ako pouzitie trojrozmerneho alfa pola s rovnakou alfa hodnotou pixelu pre kazdu zlozku rgb trojice?

Pole alfa obsahuje prevazne obdlznikove regiony s rovnakou alfa hodnotou. Ako efektivne nastavovat alfu pre pixely ohranicene suradnicami praveho horneho (riadok1, stlpec1) a laveho dolneho (riadok2,stlpec2) rohu obdlznika? Momentalne to robim len v dvoch for cykloch, alfa[riadok1:riadok2][stlpec1:stlpec2] = ALFA_HODNOTA nefunguje.
Název: Re:numpy extract s podmienkou
Přispěvatel: Mirek Prýmek 05. 03. 2016, 11:08:43
Mohl bys uvést kompletní self-contained příklad pro obrázek řekněme 2x3? Tj. přiřazení všech hodnot, ukázku, co děláš a v čem se ti to nedaří? Plus možná nějaký krátký komentář, jaký máš důvod používat vícerozměrné pole - máš konkrétní důvod, proč nepoužít
Kód: [Vybrat]
alfa[(row*ROW_LEN)+col]
?
Název: Re:numpy extract s podmienkou
Přispěvatel: Mirek Prýmek 05. 03. 2016, 11:11:42
Jo a ještě možná důvod, proč nepoužít dataframe se sloupci r, g, b, alpha, se kterým by se ti pracovalo asi vůbec nejlíp.
Název: Re:numpy extract s podmienkou
Přispěvatel: Jméno 05. 03. 2016, 18:58:57
Mohl bys uvést kompletní self-contained příklad pro obrázek řekněme 2x3? Tj. přiřazení všech hodnot, ukázku, co děláš a v čem se ti to nedaří? Plus možná nějaký krátký komentář, jaký máš důvod používat vícerozměrné pole - máš konkrétní důvod, proč nepoužít
Kód: [Vybrat]
alfa[(row*ROW_LEN)+col]
?

Pre obrazok 2x3

Kód: [Vybrat]
[[[ 36  28 237]
  [ 29 230 181]
  [  0   0   0]]

 [[ 36  28 237]
  [ 29 230 181]
  [ 29 230 181]]]

a alfu

Kód: [Vybrat]
[[1 0 0]
 [1 0 0]]

to dava vysledok [ 28 237 230 181] pre alfa hodnotu 1 a [36 29] pre 0.

Trojrozmerne pole pouzivam pretoze to je vystupom z opencv kniznice. Ak sa nemylim, ndarray je v pamati ulozene ako jednorozmerne pole a numpy potom prepocitava indexy podla nastavenych rozmerov.

Tento dataframe http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.html ? Neboli by prvky dataframu spracovane ako 1D pole rovnako ako ndarray?
Název: Re:numpy extract s podmienkou
Přispěvatel: Jméno 05. 03. 2016, 19:03:31
[ 28 237 230 181] pre alfa hodnotu 1 a [36 29] pre 0

Presne naopak, [ 28 237 230 181] pre 0 a [36 29] pre 1.
Název: Re:numpy extract s podmienkou
Přispěvatel: Mirek Prýmek 06. 03. 2016, 09:28:50
Já bych se s tím nemazal a udělal bych to takhle: https://gist.github.com/mprymek/5ef88e3d486164dd7fa0

S numpy/pandas úplně rutinně nedělám, takže nedokážu posoudit efektivitu, ale aspoň se s tím takhle pak příjemně pracuje ;)
Název: Re:numpy extract s podmienkou
Přispěvatel: Logik 06. 03. 2016, 15:16:29
Nějak nechápu, co chceš. Když dáš

rgb[ alpha == 1]

tak Ti to vyselektí ty body, kde je alpha 1, a to přece chceš.... Nebo co vlastně chceš?
Název: Re:numpy extract s podmienkou
Přispěvatel: Jméno 13. 03. 2016, 16:48:50
Nějak nechápu, co chceš. Když dáš

rgb[ alpha == 1]

tak Ti to vyselektí ty body, kde je alpha 1, a to přece chceš.... Nebo co vlastně chceš?

Presne toto som potreboval, vedel som ze sa to musi dat spravit ovela jednoduchsie! :-)