md1hunox
md1hunox

Reputation: 3965

Convert image from PIL to openCV format

I'm trying to convert image from PIL to OpenCV format. I'm using OpenCV 2.4.3. here is what I've attempted till now.

>>> from PIL import Image
>>> import cv2 as cv
>>> pimg = Image.open('D:\\traffic.jpg')                           #PIL Image
>>> cimg = cv.cv.CreateImageHeader(pimg.size,cv.IPL_DEPTH_8U,3)    #CV Image
>>> cv.cv.SetData(cimg,pimg.tostring())
>>> cv.cv.NamedWindow('cimg')
>>> cv.cv.ShowImage('cimg',cimg)
>>> cv.cv.WaitKey()

But I think the image is not getting converted to CV format. The Window shows me a large brown image. Where am I going wrong in Converting image from PIL to CV format?

Also, why do I need to type cv.cv to access functions?

Upvotes: 173

Views: 306598

Answers (6)

sharma margi
sharma margi

Reputation: 1

import cv2
import numpy as np

from PIL import Image

# Load the image

image_path = "/mnt/data/file-1ZEJNRs1fRw6rjpuCRzwQt"

image = cv2.imread(image_path)

# Convert to grayscale

gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Invert the grayscale image

inverted_image = cv2.bitwise_not(gray_image)

# Apply Gaussian blur

blurred = cv2.GaussianBlur(inverted_image, (21, 21), sigmaX=0, sigmaY=0)

# Invert the blurred image

inverted_blurred = cv2.bitwise_not(blurred)

# Create the pencil sketch

sketch = cv2.divide(gray_image, inverted_blurred, scale=256.0)

# Save the sketch

sketch_path = "/mnt/data/sketch.png"

cv2.imwrite(sketch_path, sketch)

# Return the path

to the sketch

sketch_path

Upvotes: 0

Abhishek Thakur
Abhishek Thakur

Reputation: 17035

Use this:

pil_image = PIL.Image.open('Image.jpg').convert('RGB')
open_cv_image = numpy.array(pil_image)
# Convert RGB to BGR
open_cv_image = open_cv_image[:, :, ::-1].copy()

Upvotes: 278

Pedro Nunes
Pedro Nunes

Reputation: 477

The code commented works as well, just choose which do you prefer

import numpy as np
from PIL import Image


def convert_from_cv2_to_image(img: np.ndarray) -> Image:
    # return Image.fromarray(img)
    return Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))


def convert_from_image_to_cv2(img: Image) -> np.ndarray:
    # return np.asarray(img)
    return cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)

Upvotes: 30

Christina Bornberg
Christina Bornberg

Reputation: 21

Pillow image to OpenCV image:

cv2_img = np.array(pil_img)
cv2_img = cv2.cvtColor(cv2_img, cv2.COLOR_RGB2BGR)

OpenCV image to Pillow image:

cv2_img = cv2.cvtColor(cv2_img, cv2.COLOR_BGR2RGB)
pil_img = Image.fromarray(cv2_img)

Source: https://medium.com/analytics-vidhya/the-ultimate-handbook-for-opencv-pillow-72b7eff77cd7

Upvotes: 2

phnghue
phnghue

Reputation: 1696

Here are two functions to convert image between PIL and OpenCV:

def toImgOpenCV(imgPIL): # Conver imgPIL to imgOpenCV
    i = np.array(imgPIL) # After mapping from PIL to numpy : [R,G,B,A]
                         # numpy Image Channel system: [B,G,R,A]
    red = i[:,:,0].copy(); i[:,:,0] = i[:,:,2].copy(); i[:,:,2] = red;
    return i; 

def toImgPIL(imgOpenCV): return Image.fromarray(cv2.cvtColor(imgOpenCV, cv2.COLOR_BGR2RGB));

Convert from OpenCV img to PIL img will lost transparent channel. While convert PIL img to OpenCV img will able to keep transparent channel, although cv2.imshow not display it but save as png will gave result normally.

  • You can call cv2.imwrite("./"+"fileName.png", img); to export and check the transparent result of OpenCV img.
  • Or toImgPIL(img).save('test.png', 'PNG') to check PIL img.

Upvotes: 1

Berthier Lemieux
Berthier Lemieux

Reputation: 4125

This is the shortest version I could find,saving/hiding an extra conversion:

pil_image = PIL.Image.open('image.jpg')
opencvImage = cv2.cvtColor(numpy.array(pil_image), cv2.COLOR_RGB2BGR)

If reading a file from a URL:

import cStringIO
import urllib
file = cStringIO.StringIO(urllib.urlopen(r'http://stackoverflow.com/a_nice_image.jpg').read())
pil_image = PIL.Image.open(file)
opencvImage = cv2.cvtColor(numpy.array(pil_image), cv2.COLOR_RGB2BGR)

Upvotes: 176

Related Questions