在OpenCV中加载SVG图像

5
我正在尝试下载一个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://dev59.com/fWYq5IYBdhLWcg3w30Tc
cv2.imshow('cv_img', cv_img)  # This does not look right
cv2.waitKey(0)

这些是来自PILopencv格式的结果图像:

enter image description here

enter image description here

< p > OpenCV 图像不太对,例如文本字符之间没有空格。 为什么会这样,我该如何解决?


3
当你执行convert('RGB')时,你会丢弃原始图像中似乎存在的 alpha/透明通道。这是不可取的。而且cv2.imshow()忽略了 alpha 通道,这对你的帮助更少。 - Mark Setchell
1个回答

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接