在opencv中加载svg图像

rev*_*evy 5 python svg opencv image-processing computer-vision

我正在尝试下载 svg 图像并在opencv中打开它以进行进一步处理。我正在做的是使用cairosvg从 svg 转换为 png 格式,使用Pillow打开它,最后转换为opencv. 这里的问题是转换后的图像opencv看起来与格式中的图像不完全相同PIL

from io import BytesIO
import numpy as np
import requests
from PIL import Image
from cairosvg import svg2png
import cv2

svg_url = 'https://logincdn.msauth.net/16.000.28611.4/content/images/microsoft_logo_ee5c8d9fb6248c938fd0dc19370e90bd.svg'

# Get svg data
svg_data = requests.get(svg_url).content

# Convert from svg to png
png = svg2png(bytestring=svg_data)

# Open png in PIL
pil_img = Image.open(BytesIO(png))
pil_img.show()  # This looks good

# Convert to opencv
cv_img = np.array(pil_img.convert('RGB'))[:, :, ::-1].copy()  # Taken from https://stackoverflow.com/questions/14134892/convert-image-from-pil-to-opencv-format
cv2.imshow('cv_img', cv_img)  # This does not look right
cv2.waitKey(0)
Run Code Online (Sandbox Code Playgroud)

PIL这些是分别来自和格式的结果图像opencv

在此输入图像描述

在此输入图像描述

图像opencv看起来不正确,例如文本字符之间没有空格。这是为什么?我该如何解决它?

rev*_*evy 6

正如建议的,您必须保留 Alpha 通道。

import numpy as np
import requests
from io import BytesIO
from PIL import Image
from cairosvg import svg2png
import cv2

svg_url = 'https://logincdn.msauth.net/16.000.28611.4/content/images/microsoft_logo_ee5c8d9fb6248c938fd0dc19370e90bd.svg'

svg_data = requests.get(svg_url).content

png = svg2png(bytestring=svg_data)

pil_img = Image.open(BytesIO(png)).convert('RGBA')
pil_img.save('output/pil.png')

cv_img = cv2.cvtColor(np.array(pil_img), cv2.COLOR_RGBA2BGRA)
cv2.imwrite('cv.png', cv_img)
Run Code Online (Sandbox Code Playgroud)