Použití numpy.extract s podmínkou

Jméno

Použití numpy.extract s podmínkou
« kdy: 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.
« Poslední změna: 07. 03. 2016, 11:59:56 od Petr Krčmář »


Re:numpy extract s podmienkou
« Odpověď #1 kdy: 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]
?

Re:numpy extract s podmienkou
« Odpověď #2 kdy: 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.

Jméno

Re:numpy extract s podmienkou
« Odpověď #3 kdy: 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?

Jméno

Re:numpy extract s podmienkou
« Odpověď #4 kdy: 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.


Re:numpy extract s podmienkou
« Odpověď #5 kdy: 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 ;)

Logik

  • *****
  • 1 049
    • Zobrazit profil
    • E-mail
Re:numpy extract s podmienkou
« Odpověď #6 kdy: 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š?

Jméno

Re:numpy extract s podmienkou
« Odpověď #7 kdy: 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! :-)