{"id":617,"date":"2014-09-29T21:21:02","date_gmt":"2014-09-29T18:21:02","guid":{"rendered":"http:\/\/www.galirows.com.br\/meublog\/opencv-python\/?page_id=617"},"modified":"2014-10-01T14:51:38","modified_gmt":"2014-10-01T11:51:38","slug":"mostrar-imagem-opencv-python","status":"publish","type":"page","link":"http:\/\/www.galirows.com.br\/meublog\/opencv-python\/opencv2-python27\/capitulo1-basico\/mostrar-imagem-opencv-python\/","title":{"rendered":"1.1 &#8211; Mostrar imagem"},"content":{"rendered":"<p>Para o primeiro tutorial ser\u00e1 utilizada a imagem a seguir. Eu n\u00e3o precisava citar, mas obtive esse imagem atrav\u00e9s do site\u00a0<a href=\"http:\/\/pixabay.com\" target=\"_blank\">pixabay.com<\/a>. O tutorial consiste de ler a imagem, mostr\u00e1-la, adquirir a cor de determinados pixels, alterar a cor de determinados pixels, recortar \u00a0parte da imagem e salvar uma imagem editada.<\/p>\n<p><a href=\"http:\/\/www.galirows.com.br\/meublog\/wp-content\/uploads\/2014\/09\/lampada.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-577 aligncenter\" src=\"http:\/\/www.galirows.com.br\/meublog\/wp-content\/uploads\/2014\/09\/lampada.png\" alt=\"lampada\" width=\"500\" height=\"316\" \/><\/a><\/p>\n<p><strong>Carregar e mostrar uma imagem e suas propriedades<\/strong><\/p>\n<p>Carregar e mostrar uma imagem na \u00a0OpenCV \u00e9 bastante simples, bastando utilizar o m\u00e9todo <em>imread()<\/em> que espera como par\u00e2metro o endere\u00e7o da imagem. Considerando que a imagem estar\u00e1 no mesmo diret\u00f3rio onde est\u00e1 salvo o script, basta indicar o nome da imagem como foi feito na linha 2 do c\u00f3digo abaixo. Para mostrar a imagem \u00e9 utilizado o m\u00e9todo<em> imshow()<\/em> que gerar\u00e1 uma janela e exibir\u00e1 a imagem nessa janela. O m\u00e9todo espera um nome qualquer para a janela e o objeto de imagem (no caso, o objeto de imagem \u00e9 a imagem carregada no passo anterior).<\/p>\n<p>As linhas 5, 6 e 7 apenas mostrar\u00e3o caracter\u00edsticas da imagem carregada, sendo mostrada a altura, largura\u00a0e n\u00famero de canais da imagem. Essas informa\u00e7\u00f5es s\u00e3o extra\u00eddas a partir da propriedade <em>shape<\/em> existente no objeto de imagem. Essa propriedade \u00e9 um vetor, por isso foram acessadas posi\u00e7\u00f5es (\u00edndices) do vetor para extrair apenas a propriedade desejada.<\/p>\n<p style=\"text-align: right; padding-left: 120px;\">Canais de uma imagem s\u00e3o respons\u00e1veis por armazenar informa\u00e7\u00f5es de quantidade de cor. No caso de uma imagem em escalas de cinza (que formam uma foto preto e branco), um canal \u00e9 suficiente para informar a quantidade de cor em cada pixel. Para uma imagem colorida, mais canais s\u00e3o necess\u00e1rios. Em uma imagem no padr\u00e3o RGB \u00e9 preciso 3 canais \u00a0para armazenar a quantidade de vermelho (red), verde (green) e azul (blue) existentes na imagem.<\/p>\n<p>A \u00faltima instru\u00e7\u00e3o serve para que o c\u00f3digo fique esperando alguma tecla ser apertada para finalizar, fechando as janela aberta. Se voc\u00ea estiver codificando utilizando alguma IDE de desenvolvimento, essa instru\u00e7\u00e3o pode n\u00e3o funcionar adequadamente, por isso recomendo utilizar o prompt de comando\/terminal para rodar o c\u00f3digo.<\/p>\n<pre class=\"lang:python decode:true\">import cv2\r\nimagem = cv2.imread(\"lampada.png\")\r\ncv2.imshow(\"Original\", imagem)\r\n\r\nprint \"Altura (height): %d pixels\" % (imagem.shape[0])\r\nprint \"Largura (width): %d pixels\" % (imagem.shape[1])\r\nprint \"Canais (channels): %d\"      % (imagem.shape[2])\r\n    \r\ncv2.waitKey(0)<\/pre>\n<p><strong>Pegando a cor de um pixel<\/strong><\/p>\n<p>A \u00a0continua\u00e7\u00e3o do c\u00f3digo mostrada abaixo pega a cor em determinados pixels da imagem e mostra a quantidade de vermelho, verde e azul presentes na cor. A linha 10 do c\u00f3digo (primeira linha desse subconjunto de c\u00f3digo) \u00e9 respons\u00e1vel por \u00a0pegar o pixel na coordenada 0,0 da imagem (pixel do topo superior esquerdo). Toda a imagem \u00e9 considerada uma matriz por isso a aquisi\u00e7\u00e3o do pixel necessita que seja informado a posi\u00e7\u00e3o do pixel.<\/p>\n<p>Dois detalhes importantes:<\/p>\n<ul>\n<li>O\u00a0padr\u00e3o de cor da OpenCV n\u00e3o \u00e9 RGB e sim BGR. Por isso a sequ\u00eancia de cores lidas do pixel \u00e9 azul, verde e vermelho. No c\u00f3digo, esses dados s\u00e3o armazenados em 3 vari\u00e1veis diferentes (&#8220;b&#8221;, &#8220;g&#8221; e &#8220;r&#8221;).<\/li>\n<li>As coordenadas na OpenCV n\u00e3o dada pela tradicional sequ\u00eancia linha e depois coluna. Primeiro \u00e9 informado a coluna e depois a linha de coordenada da imagem. Isso fica mais claro nas obten\u00e7\u00e3o das cores dos pixels seguintes (linhas 13, 14, 16 e 17).<\/li>\n<\/ul>\n<pre class=\"start-line:10 lang:python decode:true\">(b, g, r) = imagem[0, 0]\r\nprint \"Cor do pixel em (0, 0) - Vermelho: %d, Verde: %d, Azul: %d\" % (r, g, b)\r\n\r\n(b, g, r) = imagem[305, 250]\r\nprint \"Cor do pixel em (250, 305) - Vermelho: %d, Verde: %d, Azul: %d\" % (r, g, b)\r\n\r\n(b, g, r) = imagem[30, 250]\r\nprint \"Cor do pixel em (250, 30) - Vermelho: %d, Verde: %d, Azul: %d\" % (r, g, b)\r\n\r\ncv2.waitKey(0)<\/pre>\n<p>Como resultado do c\u00f3digo na imagem utilizada ser\u00e1 exibido o resultado mostrado abaixo. Os valores de cada canal est\u00e3o no intervalo de 0 a 255 e representam a quantidade da cor existente no canal. No caso do pixel da coordenada 0,0, esse possui a cor branca e por isso a quantidade de cada cor est\u00e1 no m\u00e1ximo (o branco \u00e9 a presen\u00e7a de todas as cores). J\u00e1 o segundo pixel est\u00e1 localizado na parte inferior da l\u00e2mpada que \u00e9 preta (a cor preta \u00e9 a aus\u00eancia das cores &#8211; no c\u00f3digo foi retornado o valor 2 para cada uma das cores o que mostra que o pixel n\u00e3o \u00e9 totalmente preto, mas praticamente). Por fim, o terceiro pixel est\u00e1 na metade da l\u00e2mpada em sua parte superior que \u00e9 laranja, sendo que sua cor \u00e9 formada por uma quantidade m\u00e1xima de vermelho, uma contribui\u00e7\u00e3o grande de verde e um pouco de azul.<\/p>\n<p style=\"padding-left: 60px;\">Cor do pixel em\u00a0(0, 0) &#8211; Vermelho: 255, Verde: 255, Azul: 255<br \/>\nCor do pixel em (250, 305) &#8211; Vermelho: 2, Verde: 2, Azul: 2<br \/>\nCor do pixel em (250, 30) &#8211; Vermelho: 255, Verde: 179, Azul: 65<\/p>\n<p><strong>Modificando o pixel de uma imagem<\/strong><\/p>\n<p>Para alterar uma imagem basta informar a cor do pixel em alguma coordenada. Na primeira linha do c\u00f3digo abaixo \u00e9 alterado o pixel da coordenada 0,0 para a cor azul. Essa altera\u00e7\u00e3o pode ficar impercept\u00edvel por isso a imagem a seguir \u00e9 um recorte do resultado ampliado 3 vezes. Na linha 21\u00a0tamb\u00e9m \u00e9 alterado os pixels de 10 at\u00e9 50 (tanto na horizontal, quanto na vertical) e colocando a cor vermelha neles.<\/p>\n<pre class=\"start-line:20 lang:python decode:true\">imagem[0, 0] = (255, 0, 0)\r\nimagem[10:50, 10:50] = (0, 0, 255)\r\ncv2.imshow(\"Modificada\", imagem)\r\n    \r\ncv2.waitKey(0)<\/pre>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-583 aligncenter\" src=\"http:\/\/www.galirows.com.br\/meublog\/wp-content\/uploads\/2014\/09\/lampadapedaco.png\" alt=\"lampadapedaco\" width=\"579\" height=\"223\" \/><strong>Imagem recortada e ampliada do resultado gerado pela altera\u00e7\u00e3o dos pixels<\/strong><\/p>\n<p>O c\u00f3digo visto acaba desenhando um quadrado na imagem. Embora essa seja uma maneira de desenhar na imagem, a OpenCV possui uma forma mais simples de fazer desenhos geom\u00e9tricos e que ser\u00e1 vista em <span style=\"color: #ff6600;\">LINK para o tutorial sobre desenhos na OpenCV<\/span>.<\/p>\n<p><strong>Fatiando a imagem e salvando o peda\u00e7o<\/strong><\/p>\n<p>Recortar um peda\u00e7o desejado da imagem \u00e9 tamb\u00e9m bastante simples. Na sequ\u00eancia do c\u00f3digo isso \u00e9 realizado atrav\u00e9s da cria\u00e7\u00e3o de uma nova imagem que \u00e9 parte da imagem original. \u00a0A nova imagem se chama &#8220;fatia&#8221; e \u00e9 composta pelos pixels de 0 at\u00e9 150 da parte vertical (do topo at\u00e9 praticamente a metade da imagem) e da parte horizontal indo das coordenada 150 at\u00e9 a de n\u00famero 300. O resultado \u00e9 mostrado na imagem abaixo e na tela ser\u00e1 mostrado atrav\u00e9s do c\u00f3digo da linha 26.<\/p>\n<p>Para salvar a imagem gerada basta utilizar o m\u00e9todo <em>imwrite()<\/em>, mostrado na linha 28, que espera um endere\u00e7amento da imagem e a matriz contendo a imagem. No caso do c\u00f3digo apresentado, a imagem ser\u00e1 gravada no mesmo local do script. Se for utilizado o nome de um arquivo que j\u00e1 existe, esse ser\u00e1 substitu\u00eddo pela nova imagem gerada.<\/p>\n<pre class=\"start-line:25 lang:python decode:true\">fatia = imagem[0:150, 150:300]\r\ncv2.imshow(\"Fatia da imagem\", fatia)\r\n\r\ncv2.imwrite(\"novalampada.png\", fatia)    \r\n\r\ncv2.waitKey(0)<\/pre>\n<p>&nbsp;<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-586\" style=\"text-align: center;\" src=\"http:\/\/www.galirows.com.br\/meublog\/wp-content\/uploads\/2014\/09\/newlampada.jpg\" alt=\"newlampada\" width=\"150\" height=\"150\" \/><strong>Fatia da imagem<\/strong><\/p>\n<p>Isso encerra a manipula\u00e7\u00e3o mais b\u00e1sica de uma imagem na OpenCV. Em princ\u00edpio a parte mais complexa deve ser saber manipular matrizes no Python j\u00e1 que uma imagem \u00e9 manipulada como se fosse uma matriz.<\/p>\n<p><strong>Sugest\u00e3o de exerc\u00edcio<\/strong><\/p>\n<p>A partir da imagem fatiada, fa\u00e7a:<\/p>\n<ol>\n<li>Eespelhamento da imagem, invertendo os pixels da esquerda para a parte da direita e vice-versa.<\/li>\n<li>Rotacione a imagem em 90 graus no sentido hor\u00e1rio.<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<hr \/>\n<p style=\"text-align: right;\"><a title=\"1.2 \u2013 Mostrar webcam e v\u00eddeo\" href=\"http:\/\/www.galirows.com.br\/meublog\/opencv-python\/capitulo-1-basico\/1-2-mostrar-webcam-e-video\/\">Pr\u00f3ximo passo &#8211; mostrar webcam e v\u00eddeo &gt;&gt;<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Para o primeiro tutorial ser\u00e1 utilizada a imagem a seguir. Eu n\u00e3o precisava citar, mas obtive esse imagem atrav\u00e9s do site\u00a0pixabay.com. O tutorial consiste de ler a imagem, mostr\u00e1-la, adquirir a cor de determinados pixels, alterar a cor de determinados &hellip; <a href=\"http:\/\/www.galirows.com.br\/meublog\/opencv-python\/opencv2-python27\/capitulo1-basico\/mostrar-imagem-opencv-python\/\">Continue lendo <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":609,"menu_order":1,"comment_status":"open","ping_status":"closed","template":"onecolumn-page.php","meta":{"footnotes":""},"class_list":["post-617","page","type-page","status-publish","hentry"],"aioseo_notices":[],"_links":{"self":[{"href":"http:\/\/www.galirows.com.br\/meublog\/opencv-python\/wp-json\/wp\/v2\/pages\/617","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.galirows.com.br\/meublog\/opencv-python\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/www.galirows.com.br\/meublog\/opencv-python\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/opencv-python\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/opencv-python\/wp-json\/wp\/v2\/comments?post=617"}],"version-history":[{"count":5,"href":"http:\/\/www.galirows.com.br\/meublog\/opencv-python\/wp-json\/wp\/v2\/pages\/617\/revisions"}],"predecessor-version":[{"id":651,"href":"http:\/\/www.galirows.com.br\/meublog\/opencv-python\/wp-json\/wp\/v2\/pages\/617\/revisions\/651"}],"up":[{"embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/opencv-python\/wp-json\/wp\/v2\/pages\/609"}],"wp:attachment":[{"href":"http:\/\/www.galirows.com.br\/meublog\/opencv-python\/wp-json\/wp\/v2\/media?parent=617"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}