Gå til innhold

[Python] Algoritme for å finne første pixel-"match" (småtregt)


Anbefalte innlegg

Så vidt jeg skjønner den matte-linken, så har du *en* gitt matrise M for å konvertere et RGB fargerom til et "XYZ" generellt rom. Dermed blir konvertering fra RGB-rom 1 til rom 2 ganske enkelt å bruke matrisen M_2^{-1}*M_1 på en kolonnevektor [R G B]. Dersom man skal konvertere et helt bilde, må man bruke konvereringsmatrisen på en Nx3-matrise [R1 R2 R3 ... \\\ G1 G2 G3 \\ B1 B2 B3]. Så vidt jeg skjønner da...

 

Men hvordan LAB funker står ikke på lenkene - bare at man kan bruke "deltaE". Kanskje man kan få skrevet en funksjon som tar *et helt bilde* i slengen - burde ikke være umulig?

Lenke til kommentar
Videoannonse
Annonse

Så vidt jeg skjønner den matte-linken, så har du *en* gitt matrise M for å konvertere et RGB fargerom til et "XYZ" generellt rom. Dermed blir konvertering fra RGB-rom 1 til rom 2 ganske enkelt å bruke matrisen M_2^{-1}*M_1 på en kolonnevektor [R G B]. Dersom man skal konvertere et helt bilde, må man bruke konvereringsmatrisen på en Nx3-matrise [R1 R2 R3 ... \\\ G1 G2 G3 \\ B1 B2 B3]. Så vidt jeg skjønner da...

 

Men hvordan LAB funker står ikke på lenkene - bare at man kan bruke "deltaE". Kanskje man kan få skrevet en funksjon som tar *et helt bilde* i slengen - burde ikke være umulig?

 

Det er absolutt mulig. Jeg antar det greieste er å demontere den metoden han bruker på enkelt-punkter, se hva den gjør, og bruke numpy til å gjøre det samme med hele bildet. (Jeg er heller ikke sikker på hvordan man konverterer XYZ til Lab, men har fått med meg at det bruker konstanter som er avhengig av fargebalansen i lyset man skal observere resultatet i - det finnes en eller annen standard som er vanligst, men ikke strengt talt riktigere enn de andre.)

 

Spørsmålet er om det lønner seg: Hvis man vanligvis finner treff tidlig sparer man antageligvis tid på å bare konvertere noen pixler; hvis man vanligvis finner treff sent sparer man antageligvis tid på å konvertere hele i ett jafs.

Endret av Djn
Lenke til kommentar
  • 4 måneder senere...

Det fine med å konvertere alt i ett jafs, er at det er en "single-instruction/multiple-data" (SIMD) ting => skulle ikke overraske meg om dette kan gjøres på grafikkort, og da går det unna :p

 

Irriterende at Python er så dårlig til å paralellisere...

Lenke til kommentar

Irriterende at Python er så dårlig til å paralellisere...

 

Vel, multiprocessing modulen fungerer ganske bra, egentlig.

 

I et program som hadde en cpu-heavy funksjon var det bare disse endringene som trengtes:

 

from multiprocessing import Pool
p = Pool(threadnum)
result_list = p.map(heavyFunc, input_list, 512)

# ---------------------- normal equivalent --------------
result_list = []
for x in input_list:
  result_list.append(heavyFunc(x))

 

Gikk fra 11 sekunder original til 3.5 sekunder på 4 threads (4 core system, 1 mill entries).

Endret av Terrasque
Lenke til kommentar

Ja, det funker greit om du har en "self-contained" funksjon, men dersom du skal kalle på en haug med funksjoner i et objekt-tre*, som *jeg* vet ikke tråkker i beina på hverandre, så funker det ikke - shared memory og threads som kjører samtidig er ikke mulig.

 

*) F.eks. om mange av objekt A henger på objekt B, og jeg ønsker å be alle A'ene om å regne ut noe, som kanskje krever lesetilgang til noe hos B (eller C, som man kan finne ved å følge en peker fra B)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...