Seite 1 von 1

PIL image in greyscale array

Verfasst: Donnerstag 24. April 2008, 11:05
von KOR
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

Verfasst: Donnerstag 24. April 2008, 12:00
von Sr4l
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.

Verfasst: Donnerstag 24. April 2008, 12:15
von audax
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.

Verfasst: Donnerstag 24. April 2008, 12:21
von Bastl
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.

Verfasst: Donnerstag 24. April 2008, 21:20
von sechsrad
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....

Verfasst: Donnerstag 24. April 2008, 21:43
von veers
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)) ;)

Verfasst: Freitag 25. April 2008, 16:24
von Sr4l
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 .

Verfasst: Freitag 25. April 2008, 16:46
von Leonidas
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).

Verfasst: Freitag 25. April 2008, 20:31
von BlackJack
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… ;-)

Verfasst: Freitag 25. April 2008, 21:37
von Sr4l
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 ;-)

Verfasst: Freitag 25. April 2008, 22:04
von Leonidas
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 ;)