Using python PIL to turn a RGB image into a pure black and white image

后端 未结 5 1971
逝去的感伤
逝去的感伤 2020-12-02 07:06

I\'m using the Python Imaging Library for some very simple image manipulation, however I\'m having trouble converting a greyscale image to a monochrome (black and white) ima

相关标签:
5条回答
  • 2020-12-02 07:22

    A simple way to do it using python :

    Python
    import numpy as np
    import imageio
    
    image = imageio.imread(r'[image-path]', as_gray=True)
    
    # getting the threshold value
    thresholdValue = np.mean(image)
    
    # getting the dimensions of the image
    xDim, yDim = image.shape
    
    # turn the image into a black and white image
    for i in range(xDim):
        for j in range(yDim):
            if (image[i][j] > thresholdValue):
                image[i][j] = 255
            else:
                image[i][j] = 0
    
    
    0 讨论(0)
  • 2020-12-02 07:27

    A PIL only solution for creating a bi-level (black and white) image with a custom threshold:

    from PIL import Image
    img = Image.open('mB96s.png')
    thresh = 200
    fn = lambda x : 255 if x > thresh else 0
    r = img.convert('L').point(fn, mode='1')
    r.save('foo.png')
    

    With just

    r = img.convert('1')
    r.save('foo.png')
    

    you get a dithered image.

    From left to right the input image, the black and white conversion result and the dithered result:

    You can click on the images to view the unscaled versions.

    0 讨论(0)
  • 2020-12-02 07:32
    from PIL import Image 
    image_file = Image.open("convert_image.png") # open colour image
    image_file = image_file.convert('1') # convert image to black and white
    image_file.save('result.png')
    

    yields

    enter image description here

    0 讨论(0)
  • 2020-12-02 07:36

    As Martin Thoma has said, you need to normally apply thresholding. But you can do this using simple vectorization which will run much faster than the for loop that is used in that answer.

    The code below converts the pixels of an image into 0 (black) and 1 (white).

    from PIL import Image
    import numpy as np
    import matplotlib.pyplot as plt
    
    #Pixels higher than this will be 1. Otherwise 0.
    THRESHOLD_VALUE = 200
    
    #Load image and convert to greyscale
    img = Image.open("photo.png")
    img = img.convert("L")
    
    imgData = np.asarray(img)
    thresholdedData = (imgData > THRESHOLD_VALUE) * 1.0
    
    plt.imshow(thresholdedData)
    plt.show()
    
    0 讨论(0)
  • 2020-12-02 07:47

    Another option (which is useful e.g. for scientific purposes when you need to work with segmentation masks) is simply apply a threshold:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    """Binarize (make it black and white) an image with Python."""
    
    from PIL import Image
    from scipy.misc import imsave
    import numpy
    
    
    def binarize_image(img_path, target_path, threshold):
        """Binarize an image."""
        image_file = Image.open(img_path)
        image = image_file.convert('L')  # convert image to monochrome
        image = numpy.array(image)
        image = binarize_array(image, threshold)
        imsave(target_path, image)
    
    
    def binarize_array(numpy_array, threshold=200):
        """Binarize a numpy array."""
        for i in range(len(numpy_array)):
            for j in range(len(numpy_array[0])):
                if numpy_array[i][j] > threshold:
                    numpy_array[i][j] = 255
                else:
                    numpy_array[i][j] = 0
        return numpy_array
    
    
    def get_parser():
        """Get parser object for script xy.py."""
        from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter
        parser = ArgumentParser(description=__doc__,
                                formatter_class=ArgumentDefaultsHelpFormatter)
        parser.add_argument("-i", "--input",
                            dest="input",
                            help="read this file",
                            metavar="FILE",
                            required=True)
        parser.add_argument("-o", "--output",
                            dest="output",
                            help="write binarized file hre",
                            metavar="FILE",
                            required=True)
        parser.add_argument("--threshold",
                            dest="threshold",
                            default=200,
                            type=int,
                            help="Threshold when to show white")
        return parser
    
    
    if __name__ == "__main__":
        args = get_parser().parse_args()
        binarize_image(args.input, args.output, args.threshold)
    

    It looks like this for ./binarize.py -i convert_image.png -o result_bin.png --threshold 200:

    0 讨论(0)
提交回复
热议问题