将opencv图像格式转换为PIL图像格式?

89

我想要转换一个已加载的图片

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

我想要运行一个像PIL过滤器一样的东西,就像在示例中那样,只需要更改变量即可。

TestPicture

但是我无法在这些类型之间进行转换。

  • 有没有办法进行这些转换?

  • OpenCV能否执行PIL包中的所有图像滤镜?

示例:

enter image description here

结果:

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'
4个回答

186

是的,OpenCV更加稳健和灵活,并且可以执行大多数可用的图像处理例程,所以可能可以使用OpenCV完成此过滤器。然而,可能没有直接的API可以实现。

无论如何,至于从OpenCV转换图像格式到PIL的问题,您可以使用Image.fromarray

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)

但是你必须记住,OpenCV 遵循 BGR 约定,而 PIL 遵循 RGB 颜色约定,因此为了保持一致性,你可能需要在转换之前使用 cv2.cvtColor()


需要将RGB2BGR从im_pil中转换吗? - polavishnu
“OpenCV […] 远远不能执行所有可用的图像处理例程。” - Cris Luengo
嗨@CrisLuengo,这是关于PIL的。 - ZdaR

46

PillowOpenCV使用不同的图像格式,因此你不能仅在Pillow中读取图像并将其转换为OpenCV图像。 如@ZdaR所指出,Pillow使用RGB格式,而OpenCV使用BGR格式。因此,你需要使用转换器来将一个格式转换为另一个。

要从PIL图像转换为OpenCV,请使用:

import cv2
import numpy as np
from PIL import Image

pil_image=Image.open("demo2.jpg") # open image using PIL

# use numpy to convert the pil_image into a numpy array
numpy_image=numpy.array(pil_img)  

# convert to a openCV2 image, notice the COLOR_RGB2BGR which means that 
# the color is converted from RGB to BGR format
opencv_image=cv2.cvtColor(numpy_image, cv2.COLOR_RGB2BGR) 

要将OpenCV图像转换为PIL图像,请使用:

import cv2
import numpy as np
from PIL import Image

opencv_image=cv2.imread("demo2.jpg") # open image using openCV2

# convert from openCV2 to PIL. Notice the COLOR_BGR2RGB which means that 
# the color is converted from BGR to RGB
color_converted = cv2.cvtColor(opencv_image, cv2.COLOR_BGR2RGB)
pil_image=Image.fromarray(color_converted)

0

这里有两个函数可以在PIL和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));

将OpenCV图像转换为PIL图像会丢失透明通道。而将PIL图像转换为OpenCV图像则可以保留透明通道,尽管cv2.imshow不会显示它,但保存为png格式将正常显示结果。


0
ZdaR的启发,如果您想将OpenCV掩码转换为PIL掩码,则只需执行以下操作:

from PIL import Image

PilMask = Image.fromarray(Mask)

在我的程序中,PilMask.mode 显示为 'L'。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接