将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】:Pillow
和 OpenCV
使用不同格式的图像。因此,您不能只读取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图像格式相互转换