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

Posted

技术标签:

【中文标题】将opencv图像格式转换为PIL图像格式?【英文标题】:Convert opencv image format to PIL image format? 【发布时间】:2017-08-31 03:55:54 【问题描述】:

我想转换加载的图像

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

我想使用变量在example 上运行PIL filter

TestPicture

但我无法在这些类型之间来回转换。

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

OpenCV 可以做 PIL 包中的所有图像过滤器吗?

例子:

结果:

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'

【问题讨论】:

【参考方案1】:

是的,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()

【讨论】:

【参考方案2】:

PillowOpenCV 使用不同格式的图像。因此,您不能只读取Pillow 中的图像并将其操作为 OpenCV 图像。 Pillow 使用RGB 格式作为突出显示的@ZdaR,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_coverted = cv2.cvtColor(opencv_image, cv2.COLOR_BGR2RGB)
pil_image=Image.fromarray(color_coverted)

【讨论】:

【参考方案3】:

这里有两个函数可以在 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 img 转换为 PIL img 会丢失透明通道。虽然将 PIL img 转换为 OpenCV img 将能够保持透明通道,虽然 cv2.imshow 不显示它但保存为 png 会正常给出结果。

【讨论】:

以上是关于将opencv图像格式转换为PIL图像格式?的主要内容,如果未能解决你的问题,请参考以下文章

python中PIL.Image,OpenCV,Numpy图像格式相互转换

OpenCV—Python PyLibTiff_psd 图像基本操作以及图像格式转换

一图看懂Python生态圈图像格式转换

将 PIL 图像转换为字节数组?

torch 中各种图像格式转换

在 Python 中将 openCV 图像转换为 PIL 图像(用于 Zbar 库)