Search code examples
pythonopencvimage-processingtype-conversionpython-imaging-library

Convert opencv image format to PIL image format?


I want to convert an image loaded

TestPicture = cv2.imread("flowers.jpg")

I would like to run a PIL filter like on the example with the variable

TestPicture

but I'm unable to convert it back and forth between these types.

  • Is there a way to do these conversions?

  • Can OpenCV do all of the image filters that are in the PIL package?

Example:

enter image description here

Result:

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
threshold_img = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
im_pil = cv2_to_pil(threshold_img)
pytesseract.image_to_string(im_pil)
Out[5]: 'TUM'

Solution

  • Yes OpenCV is more robust and flexible and can perform most of the image processing routines which are available out there, So probably this filter can be done with OpenCV> However, there may not be a straightforward API for that.

    Anyways, as far as the conversion of image format from OpenCV to PIL is concerned you may use Image.fromarray as:

    import cv2
    import numpy as np
    from PIL import Image
    
    img = cv2.imread("path/to/img.png")
    
    # You may need to convert the color.
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    im_pil = Image.fromarray(img)
    
    # For reversing the operation:
    im_np = np.asarray(im_pil)
    

    But you must keep in mind that, OpenCV follows BGR convention and PIL follows RGB color convention, so to keep the things consistent you may need to do use cv2.cvtColor() before conversion.