revy
revy

Reputation: 4727

Load svg image in opencv

I'm trying to download an svg image and open it in opencv for further processing. What I am doing is to convert from svg to png format with cairosvg, open it using Pillow and finally convert to opencv. The problem here is that the image converted in opencv does not look exactly the same as the one in PIL format.

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)

These are the resulting images from PIL and opencv format respectively:

enter image description here

enter image description here

The opencv image does not look right, e.g. the text does not have space between characters. Why is that and how can I fix it?

Upvotes: 6

Views: 16503

Answers (1)

revy
revy

Reputation: 4727

As suggested, you have to preserve alpha channel.

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)

Upvotes: 6

Related Questions