Aula2.Ex2. Imagens Matriciais $\times$ Imagens Vetoriais¶
Na Aula 2, sobre conceitos envolvidos na Computação Gráfica, vemos que podemos explorar imagens no "mundo" vetorial e matricial.
Imagens Vetoriais são representadas por vértices e funções geométricas para "construir" a imagem. Na prática, isso significa que podemos aplicar transformações geométricas como escala, rotação e translação nesses objetos.
Imagens Matriciais, formadas por um conjunto de pixeis, são uma amostra da imagem real. Neste exercício, veremos o efeito em mudar a escala (alterar o tamanho) em uma imagem matricial $\times$ imagem vetorial.
Carregar as bibliotecas necessárias para o exercício¶
from PIL import Image
import requests
from io import BytesIO
from IPython.display import display # to display images
--------------------------------------------------------------------------- ModuleNotFoundError Traceback (most recent call last) Cell In[2], line 1 ----> 1 from PIL import Image 2 import requests 3 from io import BytesIO ModuleNotFoundError: No module named 'PIL'
Fazer o download de uma imagem da internet¶
Tente trocar a URL por uma imagem de sua preferência.
url_imagem = 'https://www5.usp.br/wp-content/uploads/usp-2018preto.png'
# lendo a imagem
response = requests.get(url_imagem)
img = Image.open(BytesIO(response.content))
# exibindo a imagem
display(img)
Aumentando a imagem em $10\times$ o tamanho original¶
# informacoes da imagem
largura = img.size[0]
altura = img.size[1]
img = img.resize((largura*10,altura*10)) # aumentando 10x
# exibindo a imagem
display(img)
Resultado¶
Observe que a imagem perdeu a qualidade, apresentando serrilhados. Lembre que pixeis são apenas amostras da imagem original. Para aumentá-la, foi necessário estimar pixeis a partir da amostra.
Imagens vetoriais¶
Repetimos o processo para uma imagem em formato vetorial. Nesse caso, precisamos "renderizar" a imagem para o formato matricial antes de sua exibição.
Primeiro, instalemos algumas bibliotecas.
%pip install svglib
from svglib.svglib import svg2rlg
from reportlab.graphics import renderPDF
from IPython.core.display import HTML
Collecting svglib
Downloading svglib-1.5.1.tar.gz (913 kB)
---------------------------------------- 0.0/913.9 kB ? eta -:--:--
---------------------------------------- 913.9/913.9 kB 36.8 MB/s 0:00:00
Installing build dependencies: started
Installing build dependencies: finished with status 'done'
Getting requirements to build wheel: started
Getting requirements to build wheel: finished with status 'done'
Preparing metadata (pyproject.toml): started
Preparing metadata (pyproject.toml): finished with status 'done'
Collecting reportlab (from svglib)
Downloading reportlab-4.4.3-py3-none-any.whl.metadata (1.7 kB)
Collecting lxml (from svglib)
Downloading lxml-6.0.0-cp313-cp313-win_amd64.whl.metadata (6.8 kB)
Requirement already satisfied: tinycss2>=0.6.0 in c:\users\00661711722\downloads\cg_25.2_8001\.venv\lib\site-packages (from svglib) (1.4.0)
Collecting cssselect2>=0.2.0 (from svglib)
Downloading cssselect2-0.8.0-py3-none-any.whl.metadata (2.9 kB)
Requirement already satisfied: webencodings in c:\users\00661711722\downloads\cg_25.2_8001\.venv\lib\site-packages (from cssselect2>=0.2.0->svglib) (0.5.1)
Requirement already satisfied: pillow>=9.0.0 in c:\users\00661711722\downloads\cg_25.2_8001\.venv\lib\site-packages (from reportlab->svglib) (11.3.0)
Requirement already satisfied: charset-normalizer in c:\users\00661711722\downloads\cg_25.2_8001\.venv\lib\site-packages (from reportlab->svglib) (3.4.2)
Downloading cssselect2-0.8.0-py3-none-any.whl (15 kB)
Downloading lxml-6.0.0-cp313-cp313-win_amd64.whl (4.0 MB)
---------------------------------------- 0.0/4.0 MB ? eta -:--:--
---------------------------------------- 4.0/4.0 MB 69.5 MB/s 0:00:00
Downloading reportlab-4.4.3-py3-none-any.whl (2.0 MB)
---------------------------------------- 0.0/2.0 MB ? eta -:--:--
---------------------------------------- 2.0/2.0 MB 52.1 MB/s 0:00:00
Building wheels for collected packages: svglib
Building wheel for svglib (pyproject.toml): started
Building wheel for svglib (pyproject.toml): finished with status 'done'
Created wheel for svglib: filename=svglib-1.5.1-py3-none-any.whl size=31021 sha256=256b097bb6ca1d3c85065f51c2fc991dafe5d793e81c782a4d9e35880bb58856
Stored in directory: c:\users\00661711722\appdata\local\packages\pythonsoftwarefoundation.python.3.13_qbz5n2kfra8p0\localcache\local\pip\cache\wheels\c4\02\f3\ffa7ae5804a379f78b8f4bdd49c5b2ae63fa4d329b2a9292fa
Successfully built svglib
Installing collected packages: reportlab, lxml, cssselect2, svglib
---------------------------------------- 0/4 [reportlab]
---------------------------------------- 0/4 [reportlab]
---------------------------------------- 0/4 [reportlab]
---------------------------------------- 0/4 [reportlab]
---------------------------------------- 0/4 [reportlab]
---------------------------------------- 0/4 [reportlab]
---------------------------------------- 0/4 [reportlab]
---------------------------------------- 0/4 [reportlab]
---------------------------------------- 0/4 [reportlab]
---------------------------------------- 0/4 [reportlab]
---------------------------------------- 0/4 [reportlab]
---------- ----------------------------- 1/4 [lxml]
---------- ----------------------------- 1/4 [lxml]
---------- ----------------------------- 1/4 [lxml]
---------------------------------------- 4/4 [svglib]
Successfully installed cssselect2-0.8.0 lxml-6.0.0 reportlab-4.4.3 svglib-1.5.1
Note: you may need to restart the kernel to use updated packages.
Agora salvamos uma imagem a partir de uma URL da internet. Neste exemplo, usamos o logo do ICMC/USP em formato vetorial. Pesquise sobre o formato SVG.
url_imagem = 'https://upload.wikimedia.org/wikipedia/commons/c/c9/Webysther_20170627_-_Logo_ICMC-USP.svg'
# lendo a imagem
with open('imagem.svg', "wb") as file:
response = requests.get(url_imagem)
file.write(response.content)
img_svg = svg2rlg('imagem.svg')
Exibindo a imagem com largura de $200$ pixeis.
# exibindo a imagem
HTML('<img src="imagem.svg" width="200">')
Exibindo a imagem com largura de $400$ pixeis.
HTML('<img src="imagem.svg" width="400">')
Exibindo a imagem com largura de $800$ pixeis.
HTML('<img src="imagem.svg" width="800">')
Exibindo a imagem com largura de $2000$ pixeis.
Observe que a imagem não "perde" qualidade e virtualmente podemos usar qualquer dimensão para sua exibição.
HTML('<img src="imagem.svg" width="2000">')