Numpy and 16-bit PGM

后端 未结 5 753
梦毁少年i
梦毁少年i 2020-12-03 05:17

What is an efficient and clear way to read 16-bit PGM images in Python with numpy?

I cannot use PIL to load 16-bit PGM images due to a PIL bug. I can read in the hea

5条回答
  •  醉梦人生
    2020-12-03 06:07

    Thanks to the answer by @joe-kington for helping figure this out. The solution follows.

    There is a little bit of extra work to not hard-code the known header length (17 bytes in this case), but to determine it from the header. The PGM standard says that the header usually ends with a newline but can end with any whitespace. I think this code will break on a PGM that uses non-newline whitespace for the end-of-header delimeter. Header size in this case would be determined by the size of variables holding width, height, and maxsize, plus two bytes for 'P5', plus 4 bytes of whitespace.

    Other cases where this might break are if the width or height are larger than an int (very big image). Or if the PGM is 8-bit rather than 16-bit (which can be determined from maxval, and possible width, height, and the filesize).

    #!/usr/bin/python
    import numpy as np
    import matplotlib.pyplot as plt
    
    file='foo.pgm'
    infile = open(file,'r')
    header = next(infile)
    width, height, maxval = [int(item) for item in header.split()[1:]]
    infile.seek(len(header))
    image = np.fromfile(infile, dtype=np.uint16).reshape((height, width))
    print width, height, maxval
    plt.figimage(image)
    

提交回复
热议问题