我正在尝试将JPEG的base64表示转换为可以与OpenCV一起使用的图像。问题是,我希望能够在不需要实际保存照片的情况下完成此操作(我希望它能留在内存中)。是否有更新的方法来实现这一目标?
我正在使用python 3.6.2和OpenCV 3.3
以下是我尝试转换的输入类型的部分示例:
/ 9J / 4AAQSkZJRgABAQAASABIAAD / 4QBYRXhpZgAATU0AKgAAAAgAAgESAAMAAAA ....
我已经尝试过这些问题提供的解决方案,但是继续得到“内置操作的错误参数类型”错误:
答案 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')