PIL image in greyscale array

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
KOR
User
Beiträge: 6
Registriert: Dienstag 6. November 2007, 15:05

Donnerstag 24. April 2008, 11:05

Hi,
ich habe mir unter windoof (linux habe ich leider nicht hinbekommen) ein programm geschrieben, welches ein bild mit ner webcam macht(videocapture library) und dieses dann in eine 2d-liste als grauwert schreibt(0-255):

Code: Alles auswählen

from PIL import *
from VideoCapture import Device
import time, string

cam = Device(devnum=0, showVideoWindow=0)

height=120
width=160
cam.setResolution(width,height)

picdef=[]
for row in range(height):
    picdef.append([])

for i in range(20):
    lasttime = now = int((time.time() - starttime) / interval)
    print i
    im=cam.getImage()
    #cam.saveSnapshot(string.zfill(str(i), 4) + '.jpg', timestamp=0, boldfont=0)
    i += 1
    pic=1*picdef
    for row in range(height):
        #print row
        for col in range(width):
            rgb=im.getpixel((col,row))
            grey=(rgb[0]+rgb[1]+rgb[2])/3
            pic[row].append(grey)
    #print pic
    #stat(pic)
mein problem ist dabei das es selbst bei dieser minimal auflösung ewigkeiten dauert(auch ohne prints) das bild einzulesen. eigentlich soll da nach ne statistische auswertung der grauwerte dahinter. Am ende soll das programm Bilder im abstand von etwa ner halben sekunde machen und die Auflösung sollte dann auch wieder zumindest auf 320x240 rauf. benutze ich irgendwas was soviel resourcen kostet das das laden eines bildes so ewig dauert. gibt es irgendwas was sowas in einem bruchteil der Zeit macht.
Gruß und vielen dank
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Donnerstag 24. April 2008, 12:00

nim kein ``im.getpixel((x, y))`` sondern lade das Bild.

Code: Alles auswählen

im=cam.getImage()
img = im.load()
img[x, y]
Wenn du das machst ist ``img[x, y]`` gleich ``im.getpixel((x, y))``, nur schneller. Mehr fällt mir erstmal nicht ein.
``im.load()`` sollte gleich nach ``im = cam.getImage()`` kommen.

*edit*
``pic`` in ``img`` umbenannt, wie ich sehe hast du pic schon verwendet.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Donnerstag 24. April 2008, 12:15

Direkt aus der Doku:
getpixel

im.getpixel(xy) => value or tuple

Returns the pixel at the given position. If the image is a multi-layer image, this method returns a tuple.

Note that this method is rather slow; if you need to process larger parts of an image from Python, you can either use pixel access objects (see load), or the getdata method.

Code: Alles auswählen

import Image
import time
import sys

im = Image.open(sys.argv[1])

data=im.getdata()
greyvalues = [(r+g+b)/3 for r,g,b in data]
print sum(greyvalues)/len(greyvalues)
Das z.B. ist recht fix.
Zuletzt geändert von audax am Donnerstag 24. April 2008, 12:23, insgesamt 1-mal geändert.
Bastl
User
Beiträge: 9
Registriert: Montag 13. November 2006, 11:52

Donnerstag 24. April 2008, 12:21

Was meinst du mit statistischer Auswertung der Grauwerte.
Falls du ein Histogramm erstellen willst hilft vielleicht auch:

histogram

im.histogram() => list

Returns a histogram for the image. The histogram is returned as a list of pixel counts, one for each pixel value in the source image. If the image has more than one band, the histograms for all bands are concatenated (for example, the histogram for an "RGB" image contains 768 values).

A bilevel image (mode "1") is treated as a greyscale ("L") image by this method.

aus der PIL Doku.
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

Donnerstag 24. April 2008, 21:20

linux habe ich leider nicht hinbekommen
ist aber ein scheiss linux, oder linux-doof.

da bin ich aber stolz als windows-benutzer, das man den linux-leuten mal aus der patsche helfen kann...lol....
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Donnerstag 24. April 2008, 21:43

Tip 1: Psyco verwenden, dürfte das ganze so 2 bis 10 mal schneller machen.

Tip 2: Evtl wäre es schneller was du das Bild in ein numpy array umwandelst und dann mit numpy arbeitest.

Tip 3: grey=(rgb[0]+rgb[1]+rgb[2])/3 ist nicht gerade der beste Algorithmus. Das menschliche Auge nimmt grün zum Beispiel heller wahr als Blau. grey=(r*0.299+g*0.587+b*0.114) dürfte schon besser sein (http://en.wikipedia.org/wiki/Luma_(video)) ;)
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Freitag 25. April 2008, 16:24

sechsrad hat geschrieben:
linux habe ich leider nicht hinbekommen
ist aber ein scheiss linux, oder linux-doof.

da bin ich aber stolz als windows-benutzer, das man den linux-leuten mal aus der patsche helfen kann...lol....
Bitte lass solche dummen Aussagen die keinen Inhalt, Wissen, Intelligenz und Nutzen (usw.) zeigen. Zudem hast du nicht mal geholfen ...
Falls du weiter solche Dinge von dir geben möchtest belege deine Posts doch einfach mit irgendwelchen Quellen, die diese Aussage bestätigen, dann lasse ich dich in Ruhe.

PS: Würden das nicht noch viel andere Leute lesen, wäre ich direkter geworden. ;-)

PPS: Ich führe keine Glaubenskrieg, bin selber Windows Nutzer (privat und an der Arbeit), habe aber auch Linux Server und Laptop, bilde mir also ein beide Seiten zu kennen .
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 25. April 2008, 16:46

Sr4l hat geschrieben:Bitte lass solche dummen Aussagen die keinen Inhalt, Wissen, Intelligenz und Nutzen (usw.) zeigen. Zudem hast du nicht mal geholfen ...
Nach dazu gibt es hier einige Linux-Leute die Windows-Usern helfen. Um nicht zu sagen dass diese Leute am meisten helfen (ist glaube ich auch so eine typische Linux-Sache, in Foren rumzuhängen und Leuten mit Problemen zu helfen, siehe die ganzen Communities, Usergruppen etc).
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Freitag 25. April 2008, 20:31

Das liegt daran, das die Linux-Benutzer sonst kein Leben haben. Oder daran das sie nicht duschen. Oder duschen sie nicht, weil sie sowieso keine Freunde haben!? Oder geht das nur mir so… ;-)
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Freitag 25. April 2008, 21:37

BlackJack hat geschrieben:Das liegt daran, das die Linux-Benutzer sonst kein Leben haben. Oder daran das sie nicht duschen. Oder duschen sie nicht, weil sie sowieso keine Freunde haben!? Oder geht das nur mir so… ;-)
Huhn - Ei Problem?

Ich danke dir. Ich hatte schon befürchtet heute keinen Grund mehr zu finden noch zu lachen ;-)
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 25. April 2008, 22:04

BlackJack hat geschrieben:Oder daran das sie nicht duschen.
Für mich bitte ein Vanilleeis.

Ups, Insider aus dem falschen Forum. Aber immerhin gehts dort um Linux ;)
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten