将base64 String转换为与OpenCV兼容的Image

时间:2017-08-28 16:14:37

标签: python opencv

我正在尝试将JPEG的base64表示转换为可以与OpenCV一起使用的图像。问题是,我希望能够在不需要实际保存照片的情况下完成此操作(我希望它能留在内存中)。是否有更新的方法来实现这一目标?

我正在使用python 3.6.2和OpenCV 3.3

以下是我尝试转换的输入类型的部分示例:

  

/ 9J / 4AAQSkZJRgABAQAASABIAAD / 4QBYRXhpZgAATU0AKgAAAAgAAgESAAMAAAA ....

我已经尝试过这些问题提供的解决方案,但是继续得到“内置操作的错误参数类型”错误:

6 个答案:

答案 0 :(得分:5)

这里是python 3.6的一个例子,它使用imageio而不是PIL。它首先加载图像并将其转换为b64_string。然后可以发送该字符串并重建图像,如下所示:

import base64
import io
import cv2
from imageio import imread
import matplotlib.pyplot as plt

filename = "yourfile.jpg"
with open(filename, "rb") as fid:
    data = fid.read()

b64_bytes = base64.b64encode(data)
b64_string = b64_bytes.decode()

# reconstruct image as an numpy array
img = imread(io.BytesIO(base64.b64decode(b64_string)))

# show image
plt.figure()
plt.imshow(img, cmap="gray")

# finally convert RGB image to BGR for opencv
# and save result
cv2_img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
cv2.imwrite("reconstructed.jpg", cv2_img)
plt.show()

答案 1 :(得分:1)

我一直在努力解决这个问题,当然,一旦我发布了一个问题 - 我就明白了。

对于我的特定用例,我需要将字符串转换为PIL Image以在另一个函数中使用,然后再将其转换为在OpenCV中使用的numpy数组。您可能会想,“为什么要转换为RGB?”。我添加了这个,因为从PIL图像转换时 - > Numpy数组,OpenCV默认为BGR的图像。

无论如何,这是我的两个辅助函数,它解决了我自己的问题:

import io
import cv2
import base64 
import numpy as np
from PIL import Image

# Take in base64 string and return PIL image
def stringToImage(base64_string):
    imgdata = base64.b64decode(base64_string)
    return Image.open(io.BytesIO(imgdata))

# convert PIL Image to an RGB image( technically a numpy array ) that's compatible with opencv
def toRGB(image):
    return cv2.cvtColor(np.array(image), cv2.COLOR_BGR2RGB)

答案 2 :(得分:1)

你也可以试试这个:

import numpy as np
import cv2

def to_image_string(image_filepath):
    return open(image_filepath, 'rb').read().encode('base64')

def from_base64(base64_data):
    nparr = np.fromstring(base64_data.decode('base64'), np.uint8)
    return cv2.imdecode(nparr, cv2.IMREAD_ANYCOLOR)

您现在可以像这样使用它:

filepath = 'myimage.png'
encoded_string = to_image_string(filepath)

使用open cv加载它:

im = from_base64(encoded_string)
cv2.imwrite('myloadedfile.png', im)

答案 3 :(得分:0)

以下一些命令可能会有所帮助

import io
import cv2
import base64 
import numpy as np
from PIL import Image

#convert image to byte type
with open("tes-img/example27.png", "rb") as image_file:
    encoded_string1 = base64.b64encode(image_file.read())

#convert byte to string
encoded_string = encoded_string1.decode("utf-8")

#convert string to byte
base64_image = str.encode(encoded_string)

#save image locally
with open("tes-img/example27_2.png", "wb") as fh:
    fh.write(base64.decodebytes(base64_image))

#convert byte to numpy array for cv2 
img_color = cv2.cvtColor(np.array(Image.open(io.BytesIO(base64.b64decode(base64_image)))), cv2.COLOR_BGR2RGB)

答案 4 :(得分:0)

 import base64

到base64的图像

with open("trialImage.jpg", "rb") as img_file:
        my_string = base64.b64encode(img_file.read())
        print(my_string)
    

base64到图像

with open("generatedImage.jpg", 'wb+') as image:
        image.write(base64.b64decode(my_string))

答案 5 :(得分:0)

我已经尝试了所有这些方法,但对我不起作用,并且出现了无法识别的编码错误。

对我有用的脚本。使用请求直接下载图像并使用PIL显示

import requests
from io import BytesIO
import base64
from PIL import Image
def image_show(image_url=None):
    img_response = requests.get(image_url)
    if img_response.ok:
        image_bytes = BytesIO(base64.b64decode(base64.b64encode(img_response.content)))
        img = Image.open(image_bytes)
        return img
    else:
        print("invalid image url response")
image_show(image_url= 'https://images.unsplash.com/photo-1515628640587-603301d8a4d4?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&dl=shane-stagner-mdS-6oNgRXc-unsplash.jpg')