¿Cómo escribir el filtro de imagen PIL para formato pgm simple?

¿Cómo puedo escribir un filtro para la biblioteca de imágenes de python para formato pci simple ascii (P2)? El problema aquí es que el filtro PIL básico supone un número constante de bytes por píxel.

Mi objetivo es abrir feep.pgm con Image.open (). Verhttp://netpbm.sourceforge.net/doc/pgm.html o por debajo.

La solución alternativa es encontrar otro formato de escala de grises ascii bien documentado que sea compatible con PIL y todos los principales programas de gráficos. ¿Alguna sugerencia?

feep.pgm:

P2
# feep.pgm
24 7
15
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
0  3  3  3  3  0  0  7  7  7  7  0  0 11 11 11 11  0  0 15 15 15 15  0
0  3  0  0  0  0  0  7  0  0  0  0  0 11  0  0  0  0  0 15  0  0 15  0
0  3  3  3  0  0  0  7  7  7  0  0  0 11 11 11  0  0  0 15 15 15 15  0
0  3  0  0  0  0  0  7  0  0  0  0  0 11  0  0  0  0  0 15  0  0  0  0
0  3  0  0  0  0  0  7  7  7  7  0  0 11 11 11 11  0  0 15  0  0  0  0
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0

editar: Gracias por la respuesta, funciona ...pero Necesito una solución que use Image.open (). La mayoría de los programas de Python que existen utilizan PIL para la manipulación de gráficos (google: imagen de Python abierta). Por lo tanto, necesito poder registrar un filtro en PIL. Entonces, puedo usar cualquier software que use PIL. Ahora pienso en su mayoría programas dependientes scipy, pylab, etc.

editar Ok, creo que lo tengo ahora. A continuación se muestra el contenedor pgm2pil.py:

import Image
import numpy

def pgm2pil(filename):

    try:
        inFile = open(filename)

        header = None
        size = None
        maxGray = None
        data = []

        for line in inFile:
            stripped = line.strip()

            if stripped[0] == '#': 
                continue
            elif header == None: 
                if stripped != 'P2': return None
                header = stripped
            elif size == None:
                size = map(int, stripped.split())
            elif maxGray == None:
                maxGray = int(stripped)
            else:
                for item in stripped.split():
                    data.append(int(item.strip()))

        data = numpy.reshape(data, (size[1],size[0]))/float(maxGray)*255
        return numpy.flipud(data)

    except:
        pass

    return None

def imageOpenWrapper(fname):
    pgm = pgm2pil(fname)
    if pgm is not None:
        return Image.fromarray(pgm)
    return origImageOpen(fname)

origImageOpen = Image.open
Image.open = imageOpenWrapper

Hay una ligera mejora en la respuesta de misha. Image.open debe guardarse para evitar bucles interminables. Si pgm2pil devuelve None, el contenedor llama a pgm2pil, que devuelve None, que llama a pgm2pil ...

A continuación se muestra la función de prueba (feep_false.pgm es un pgm con formato incorrecto, por ejemplo, "P2" -> "FOO" y lena.pgm es soloel archivo de imagen):

import pgm2pil
import pylab

try:
    pylab.imread('feep_false.pgm')
except IOError:
    pass
else:
    raise ValueError("feep_false should fail")

pylab.subplot(2,1,1)
a = pylab.imread('feep.pgm')
pylab.imshow(a)

pylab.subplot(2,1,2)
b = pylab.imread('lena.png')
pylab.imshow(b)

pylab.show()

Respuestas a la pregunta(1)

Su respuesta a la pregunta