{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "aYAtDiRwYEzv" }, "source": [ "# Aula2.Ex1. Explorando Pixeis e o Sistema `RGB`\n", "Na Aula 2, sobre conceitos envolvidos na Computação Gráfica, vemos que podemos explorar imagens no \"mundo\" vetorial e matricial. \n", "\n", "Embora a modelagem de objetos geométricos seja muito mais adequada no mundo vetorial, temos que lidar com imagens matriciais no momento de exibição no dispositivo de saída (como um monitor). Na prática, no fim do do processo, é necessário realizar uma conversão matricial.\n", "\n", "Neste exercício, exploraremos um pouco o conceito de pixel, que é importante para o mundo matricial.\n", "\n", "Vimos que pixel é uma amostra de um ponto de imagem e que o tamanho da amostra está associado com a qualidade da imagem.\n", "\n", "Vamos carregar uma imagem e explorar um pouco o sistema `RGB`." ] }, { "cell_type": "markdown", "metadata": { "id": "alaRo8TbYEz2" }, "source": [ "## Carregar as bibliotecas necessárias para o exercício" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "executionInfo": { "elapsed": 969, "status": "ok", "timestamp": 1618504455811, "user": { "displayName": "Ricardo Marcondes Marcacini", "photoUrl": "", "userId": "13689272637408260080" }, "user_tz": 180 }, "id": "rUzmUJ07YEz3" }, "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": "IjDg4habYEz4" }, "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": 0, "output_embedded_package_id": "1mlNXwoBlere7JI54vvro6FD49th6WKvo" }, "executionInfo": { "elapsed": 8169, "status": "ok", "timestamp": 1618504463043, "user": { "displayName": "Ricardo Marcondes Marcacini", "photoUrl": "", "userId": "13689272637408260080" }, "user_tz": 180 }, "id": "u-JOBVPkYEz4", "outputId": "7f5323a2-21f4-4f79-80d0-020aa95da1fd" }, "outputs": [], "source": [ "url_imagem = 'http://imagens.usp.br/wp-content/uploads/13072012frutasfotoMarcosSantos008.jpg'\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": "enuZ-4P2YEz6" }, "source": [ "## Explorando a matriz de pixeis da imagem\n", "Vimos que a imagem é composta por uma matriz de pixeis. A dimensão dessa matriz representa a dimensão da imagem (largura e altura).\n", "\n", "Cada pixel é composto pela tripla `RGB` (`R`=*Red*, `G`=*Green*, `B`=*Blue*). E cada componente possui uma escala de $0$ a $255$.\n", "\n", "Desafio: percorrer a matriz de pixels e \"clarear\" o fundo da imagem. Para esse caso, o fundo da imagem é composto por pixels em tons de cinza. Toda vez que encontrarmos um pixel nesse tom, somamos um fator de \"clareamento\". É importante lembrar que quanto mais próximo de $255$, menor a intensidade da componente.\n", "\n", "Regra de clareamento: se a componente `R` é maior do que $32$, então clarear o pixel (tente alterar a regra e observe o resultado)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 0 }, "executionInfo": { "elapsed": 10248, "status": "ok", "timestamp": 1618504465134, "user": { "displayName": "Ricardo Marcondes Marcacini", "photoUrl": "", "userId": "13689272637408260080" }, "user_tz": 180 }, "id": "SGzIzdyMYEz7", "outputId": "ffbadd5d-d671-4f99-abd8-b899865c7d48", "scrolled": true }, "outputs": [], "source": [ "# informacoes da imagem\n", "largura = img.size[0]\n", "altura = img.size[1]\n", "\n", "# obtem a matriz de pixeis da imagem\n", "matrix_pixeis = img.load()\n", "\n", "for i in range(largura):\n", " for j in range(altura):\n", " pixel = matrix_pixeis[i, j] # tomamos o pixel na posicao i e j\n", "\n", " R = pixel[0]\n", " G = pixel[1]\n", " B = pixel[2]\n", " \n", " # Regra de clareamento: se a componente R é maior do que 32, então clarear o pixel (experimente ctiar outras)\n", " if R > 32:\n", " R = 2*R\n", " G = 2*G\n", " B = 2*B\n", " novo_pixel = (R, G, B)\n", " matrix_pixeis[i, j] = novo_pixel\n", " \n", "# exibindo a imagem\n", "display(img)" ] }, { "cell_type": "markdown", "metadata": { "id": "ZffE93WHYEz8" }, "source": [ "## Resultado\n", "O resultado acima não ficou tão ruim, considerando que usamos uma regra tão simples. Tente melhorar a regra de clareamento. Tente adicionar novas regras. Consegue remover a sombra?" ] }, { "cell_type": "markdown", "metadata": { "id": "SShv-KGpYEz8" }, "source": [ "## Desafio para casa\n", "Pense no sistema `RGB`, pesquise e verifique como deixar a imagem em tons de cinza. Na dúvida, procure seu monitor ou professor (depois de pesquisa)." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "img = Image.open(BytesIO(response.content))\n", "matrix_pixeis = img.load()\n", "for i in range(largura):\n", " for j in range(altura):\n", " pixel = matrix_pixeis[i, j]\n", " R = pixel[0]\n", " G = pixel[1]\n", " B = pixel[2]\n", " if R > B:\n", " R, B = B, R\n", " novo_pixel = (R, G, B)\n", " matrix_pixeis[i, j] = novo_pixel\n", "display(img)" ] } ], "metadata": { "colab": { "name": "Aula01.Ex01. Brincando com Pixels e o Sistema RGB.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 }