Converting RGBA Images in a folder and save it to another folder in '.pgm' format

371 Views Asked by At

I have a group of RGBA images saved in a folder, my goal is to convert these images into another folder in a pgm format, below is the code:

path1 = file/path/where/image/are/stored
path2 = file/path/where/pgm/images/will/be/saved

list = os.listdir(path1)
for file in listing:
    #Transforms an RGBA with channel into an RGB only
    image_rgb = Image.open(file).convert('RGB')

    #Color separation stains to detect microscopic cells
    ihc_hed = rgb2hed(image_rgb)

    #Trasnforms the image into a numpy array of the UINT8 Type
    cv_img = ihc_hed.astype(np.uint8)

    # create color boundaries boundaries detecting black and blue stains
    lower = np.array([0,0,0], dtype = "uint8")
    upper = np.array([0,0,255], dtype = "uint8")
    #calculates the pixel within the specified boundaries and create a mask
    mask = cv2.inRange(cv_img, lower, upper)
    img = Image.fromarray(mask,'L')
    img.save(path2+file,'pgm')

however I get an error stating KeyError: 'PGM', it seems that the 'pgm' format is not in the modes

Thanks for the advice :)

1

There are 1 best solutions below

0
On

As far as I can see scikit image uses the Python Imaging Library plugin for saving image files. PIL does not support PGM.

Refer to http://effbot.org/imagingbook/decoder.htm for how to write your own file decoder for PIL.

Extract:

import Image, ImageFile
import string

class SpamImageFile(ImageFile.ImageFile):

    format = "SPAM"
    format_description = "Spam raster image"

    def _open(self):

        # check header
        header = self.fp.read(128)
        if header[:4] != "SPAM":
            raise SyntaxError, "not a SPAM file"

        header = string.split(header)

        # size in pixels (width, height)
        self.size = int(header[1]), int(header[2])

        # mode setting
        bits = int(header[3])
        if bits == 1:
            self.mode = "1"
        elif bits == 8:
            self.mode = "L"
        elif bits == 24:
            self.mode = "RGB"
        else:
            raise SyntaxError, "unknown number of bits"

        # data descriptor
        self.tile = [
            ("raw", (0, 0) + self.size, 128, (self.mode, 0, 1))
        ]

Image.register_open("SPAM", SpamImageFile)

Image.register_extension("SPAM", ".spam")
Image.register_extension("SPAM", ".spa") # dos version