{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "5oek3G8iYgpD" }, "source": [ "# Aula2.Ex2. Imagens Matriciais $\\times$ Imagens Vetoriais\n", "Na Aula 2, sobre conceitos envolvidos na Computação Gráfica, vemos que podemos explorar imagens no \"mundo\" vetorial e matricial. \n", "\n", "*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.\n", "\n", "*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." ] }, { "cell_type": "markdown", "metadata": { "id": "Eb2xptosYgpd" }, "source": [ "## Carregar as bibliotecas necessárias para o exercício" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "executionInfo": { "elapsed": 999, "status": "ok", "timestamp": 1618504472745, "user": { "displayName": "Ricardo Marcondes Marcacini", "photoUrl": "", "userId": "13689272637408260080" }, "user_tz": 180 }, "id": "Voe1Qe7HYgpe" }, "outputs": [], "source": [ "from PIL import Image\n", "import requests\n", "from io import BytesIO\n", "from IPython.display import display # to display images" ] }, { "cell_type": "markdown", "metadata": { "id": "c_3jP9XCYgpg" }, "source": [ "## Fazer o download de uma imagem da internet\n", "Tente trocar a URL por uma imagem de sua preferência." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 199 }, "executionInfo": { "elapsed": 3277, "status": "ok", "timestamp": 1618504475037, "user": { "displayName": "Ricardo Marcondes Marcacini", "photoUrl": "", "userId": "13689272637408260080" }, "user_tz": 180 }, "id": "M9q6K77uYgpg", "outputId": "c16c4f1d-fbcc-4a01-dcd6-2e2da7e97ead" }, "outputs": [], "source": [ "url_imagem = 'https://www5.usp.br/wp-content/uploads/usp-2018preto.png'\n", "\n", "# lendo a imagem\n", "response = requests.get(url_imagem)\n", "img = Image.open(BytesIO(response.content))\n", "\n", "# exibindo a imagem\n", "display(img)" ] }, { "cell_type": "markdown", "metadata": { "id": "Kl4UVUxGYgpj" }, "source": [ "## Aumentando a imagem em $10\\times$ o tamanho original" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "siM_92q6Ygpk" }, "outputs": [], "source": [ "# informacoes da imagem\n", "largura = img.size[0]\n", "altura = img.size[1]\n", "\n", "img = img.resize((largura*10,altura*10)) # aumentando 10x\n", "\n", "# exibindo a imagem\n", "display(img)" ] }, { "cell_type": "markdown", "metadata": { "id": "siM_92q6Ygpk" }, "source": [ "## Resultado\n", "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.\n", "## Imagens vetoriais\n", "Repetimos o processo para uma imagem em formato vetorial. Nesse caso, precisamos \"renderizar\" a imagem para o formato matricial antes de sua exibição.\n", "\n", "Primeiro, instalemos algumas bibliotecas." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "executionInfo": { "elapsed": 11238, "status": "ok", "timestamp": 1618504483016, "user": { "displayName": "Ricardo Marcondes Marcacini", "photoUrl": "", "userId": "13689272637408260080" }, "user_tz": 180 }, "id": "ZI7p2gX4Ygpm", "outputId": "8464fa37-0646-4536-a5c7-79300bd3334e" }, "outputs": [], "source": [ "#!pip install svglib\n", "from svglib.svglib import svg2rlg\n", "from reportlab.graphics import renderPDF\n", "from IPython.core.display import HTML" ] }, { "cell_type": "markdown", "metadata": { "id": "_fLe5uxyYgpn" }, "source": [ "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." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "executionInfo": { "elapsed": 11237, "status": "ok", "timestamp": 1618504483018, "user": { "displayName": "Ricardo Marcondes Marcacini", "photoUrl": "", "userId": "13689272637408260080" }, "user_tz": 180 }, "id": "sDfuTgvuYgpn" }, "outputs": [], "source": [ "url_imagem = 'https://upload.wikimedia.org/wikipedia/commons/c/c9/Webysther_20170627_-_Logo_ICMC-USP.svg'\n", "\n", "# lendo a imagem\n", "\n", "#with open('imagem.svg', \"wb\") as file:\n", "# response = requests.get(url_imagem)\n", "# file.write(response.content)\n", " \n", "\n", "img_svg = svg2rlg('imagem.svg')" ] }, { "cell_type": "markdown", "metadata": { "id": "fiA2WWP3Ygpo" }, "source": [ "Exibindo a imagem com largura de $200$ pixeis." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 0 }, "executionInfo": { "elapsed": 11229, "status": "ok", "timestamp": 1618504483020, "user": { "displayName": "Ricardo Marcondes Marcacini", "photoUrl": "", "userId": "13689272637408260080" }, "user_tz": 180 }, "id": "RKz9eA_DYgpo", "outputId": "c19d3b93-d070-4562-c8ef-f52d8cf6d627" }, "outputs": [], "source": [ "# exibindo a imagem\n", "HTML('')" ] }, { "cell_type": "markdown", "metadata": { "id": "EcB7cqWUYgpp" }, "source": [ "Exibindo a imagem com largura de $400$ pixeis." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "executionInfo": { "elapsed": 11224, "status": "ok", "timestamp": 1618504483022, "user": { "displayName": "Ricardo Marcondes Marcacini", "photoUrl": "", "userId": "13689272637408260080" }, "user_tz": 180 }, "id": "eo8yOhSNYgpq", "outputId": "114ef329-e894-4c5d-a6bf-d609894b868e" }, "outputs": [], "source": [ "HTML('')" ] }, { "cell_type": "markdown", "metadata": { "id": "iKI5ELuRYgpq" }, "source": [ "Exibindo a imagem com largura de $800$ pixeis." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "executionInfo": { "elapsed": 11212, "status": "ok", "timestamp": 1618504483023, "user": { "displayName": "Ricardo Marcondes Marcacini", "photoUrl": "", "userId": "13689272637408260080" }, "user_tz": 180 }, "id": "rOBiNMvlYgpr", "outputId": "796c0050-5dc0-4adf-a913-ffc5c5452e96" }, "outputs": [], "source": [ "HTML('')" ] }, { "cell_type": "markdown", "metadata": { "id": "chUd8B01Ygpr" }, "source": [ "Exibindo a imagem com largura de $2000$ pixeis.\n", "\n", "Observe que a imagem não \"perde\" qualidade e virtualmente podemos usar qualquer dimensão para sua exibição." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 54 }, "executionInfo": { "elapsed": 11204, "status": "ok", "timestamp": 1618504483025, "user": { "displayName": "Ricardo Marcondes Marcacini", "photoUrl": "", "userId": "13689272637408260080" }, "user_tz": 180 }, "id": "pKMS3xZ2Ygps", "outputId": "aa11da2a-66dd-4e99-b5c0-f82d09f9ddf1" }, "outputs": [], "source": [ "HTML('')" ] } ], "metadata": { "colab": { "name": "Aula01.Ex02. Imagens Matriciais vs Imagens Vetoriais.ipynb", "provenance": [] }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.7" } }, "nbformat": 4, "nbformat_minor": 1 }