﻿<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ImageSurvey &#187; JAI</title>
	<atom:link href="http://www.imagesurvey.com.br/category/jai/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.imagesurvey.com.br</link>
	<description>Processamento de imagens na prática</description>
	<lastBuildDate>Sat, 06 Aug 2011 14:14:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Inversão de imagens</title>
		<link>http://www.imagesurvey.com.br/2010/06/inversao-de-imagens/</link>
		<comments>http://www.imagesurvey.com.br/2010/06/inversao-de-imagens/#comments</comments>
		<pubDate>Tue, 08 Jun 2010 12:35:51 +0000</pubDate>
		<dc:creator>Gabriela Bauermann</dc:creator>
				<category><![CDATA[JAI]]></category>
		<category><![CDATA[Métodos]]></category>
		<category><![CDATA[cor]]></category>
		<category><![CDATA[imagens binárias]]></category>

		<guid isPermaLink="false">http://www.imagesurvey.com.br/?p=2066</guid>
		<description><![CDATA[Inversão de imagens é um tema bem simples, mas qual foi a minha surpresa ao perceber que a JAI, biblioteca de processamento de imagens da Sun, não lida com isso de forma tão simples como eu pensava. Não tem muito o que explicar sobre inversão, mas quero deixar claro a diferença entre inverter o valor [...]]]></description>
			<content:encoded><![CDATA[<p>Inversão de imagens é um tema bem simples, mas qual foi a minha surpresa ao perceber que a JAI, biblioteca de processamento de imagens da Sun, não lida com isso de forma tão simples como eu pensava. Não tem muito o que explicar sobre inversão, mas quero deixar claro a diferença entre inverter o valor dos pixels e inverter uma tabela de cores, e as consequências para o uso da segunda como artifício de otimização.<span id="more-2066"></span></p>
<h2>A teoria</h2>
<p>Inverter uma imagem é fazer com os valores dos pixels invertam seus valores, na escala em que estão. Em imagens tons de cinza de 8-bits os valores dos pixels vão de 0 a 255. A inversão faz com que os pixels que têm valor 0, passem a valer 255, os que tem valor 1 passem a valer 254, e assim por diante. Normalmente representa-se esta operação por uma fórmula simples:</p>
<p>pixel_resultado = valor_máximo &#8211; pixel</p>
<p>No caso de imagens RGB (ou muiti-canais em geral), inverte-se cada canal como está descrito acima, e no caso de imagens binárias o zero vira um e o um vira zero.</p>
<div id="attachment_2077" class="wp-caption aligncenter" style="width: 622px"><img src="http://www.imagesurvey.com.br/wp-content/uploads/2010/06/inversao-de-grilos.png" alt="Inversão de imagens RBG, cinza e binária." title="Inversão de imagens RBG, cinza e binária." width="612" height="309" class="size-full wp-image-2077" /><p class="wp-caption-text">Inversão de imagens RBG, cinza e binária.</p></div>
<p>A imagem dos grilos é do <a href="http://www.flickr.com/photos/taeb/sets/72157622992773151/">Thiago Gama Oliveira</a>.</p>
<h2>Na JAI</h2>
<p>A JAI tem a operação &#8220;invert&#8221;, que à primeira vista parece resolver isso tudo&#8230; mas não é bem assim. Em imagens binárias, o &#8220;invert&#8221; não modifica os pixels, modifica o mapa de cores. Isto significa que os píxels continuam tendo os mesmos valores que os originais, mas a aparência deles (a cor exibida no monitor) muda.</p>
<p>Na documentação da JAI isto quase não aparece, ou é citado rapidamente como um recurso de otimização. E não seria mesmo algo ruim se todos os usuários estivessem interessados somente no visual da imagem. Mas quando precisa-se dos valores dos pixels para cálculos posteriores a coisa complica.</p>
<p>Procurando por uma solução achei este <a href="https://jai-core.dev.java.net/issues/show_bug.cgi?id=70" target="_self">registro de bug</a> de 2006 lá na JAI, com tudo explicado, inclusive exemplo, e uma tentativa de solução que deveria funcionar, mas não funciona. O registro está lá, mas não foi resolvido ainda &#8211; e pela idade acho que não vai ser resolvido nunca.</p>
<p>Em resumo, a JAI inverte a tabela de cores, e não os pixels. Mas ao usar a imagem invertida para outras operações ela desconsidera a tabela de cores! Assim, inverter a imagem e depois somar com outra tem o mesmo resultado de somar as duas sem inverter antes. A operação &#8220;not&#8221;, que é um tipo de inversão específica para imagens binárias, tem o mesmo problema.</p>
<p><strong>Conclusão: a JAI não inverte imagens binárias corretamente.</strong></p>
<p>Depois de algumas semanas de pesquisa, e daquela conhecida frustração de achar que era eu que não sabia usar os métodos corretamente, resolvi partir para uma implementação independente da inversão. Não ficou otimizada, nem eu me dei ao trabalho de implementá-la estendendo a JAI, como manda o figurino, mas funciona.</p>
<p>Na verdade usei alguns artifícios dos quais não me orgulho, mas fiz porque não encontrei alternativas mais elegantes &#8211; provavelmente vou encontrar, a aí publico o código novamente. Mas por hora incluí a minha classe aqui para quem quiser utilizar (com licença GPL).</p>
<p><a href='http://www.imagesurvey.com.br/wp-content/uploads/2010/06/BinaryInvert.zip'>BinaryInvert.java</a><br />
Obs: O arquivo está &#8220;zipado&#8221; porque <code>.java</code> aparentemente é uma ameaça de segurança para o meu provedor.</p>
<p>Bom, se alguém olhar e achar que tem uma foma beeeeem mais fácil de fazer isso, não pense que vai me ofender &#8211; por favor me diga! Na verdade estou torcendo para que isto aconteça&#8230;</p>
<p>Até mais!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.imagesurvey.com.br/2010/06/inversao-de-imagens/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Como eu comecei a usar a JAI</title>
		<link>http://www.imagesurvey.com.br/2010/03/como-eu-comecei-a-usar-a-jai/</link>
		<comments>http://www.imagesurvey.com.br/2010/03/como-eu-comecei-a-usar-a-jai/#comments</comments>
		<pubDate>Wed, 10 Mar 2010 14:22:11 +0000</pubDate>
		<dc:creator>Gabriela Bauermann</dc:creator>
				<category><![CDATA[JAI]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.imagesurvey.com.br/?p=1927</guid>
		<description><![CDATA[Enquanto o blog estava em férias, eu estava trabalhando em um projeto da minha empresa. Neste projeto optamos por usar a JAI num aplicativo de análise de imagens. Eu já conhecia, mas nunca tinha programado com esta biblioteca, aí tive que aprender por onde começar. É isto que vou contar aqui. A JAI Java Advanced [...]]]></description>
			<content:encoded><![CDATA[<p>Enquanto o blog estava em férias, eu estava trabalhando em um projeto da minha empresa. Neste projeto optamos por usar a JAI num aplicativo de análise de imagens. Eu já conhecia, mas nunca tinha programado com esta biblioteca, aí tive que aprender por onde começar. É isto que vou contar aqui.</p>
<h2>A JAI</h2>
<p>Java Advanced Imaging é o nome da biblioteca da sun para processamento de imagens. O tutorial mais completo que connheço é <a href="http://java.sun.com/products/java-media/jai/forDevelopers/jai1_0_1guide-unc/">este</a> (mas repare que é de 1999&#8230;). Também <del datetime="2010-03-11T11:05:28+00:00">não existe um livro para quem precisa entender ele a fundo</del>, então as minhas principais ferramentas de estudo foram:</p>
<ul>
<li><a href="http://download.java.net/media/jai/javadoc/1.1.3/jai-apidocs/index.html" target="_blank">A documentação da API</a></li>
<li><a href="https://jai-core.dev.java.net/source/browse/jai-core/src/share/classes/javax/media/jai/" target="_blank">O código</a></li>
</ul>
<p>É, algumas vezes só olhando o código, mesmo&#8230;</p>
<p>Também tive a ajuda de colegas que aprenderam antes de mim, e de um tutorial em português organizado por eles, que estamos organizando para distribuir.</p>
<h2>OK, now codding:</h2>
<p>Depois de baixar a biblioteca, configurar o IDE, e iniciar um projeto, vem aquela sensação de &#8220;papel em branco&#8221;. O que resolve isso é uma classe main que abre a imagem e mostra a imagem (ou salva). Depois disso pronto é só achar o método que você precisa usar e colocar no meio&#8230;</p>
<p>Código para abrir a imagem (comece com este):</p>
<p><code><br />
PlanarImage imagem = JAI.create("fileload", "caminho e nome do arquivo");<br />
</code></p>
<p>Para mostrar a imagem:<br />
<code><br />
DisplayJAI display = new DisplayJAI(imagem); //altere o nome da variável se o resultado da sua operação tiver outro nome<br />
//cria o frame do swing onde a imagem será exibida<br />
JFrame frame = new JFrame("Imagem X");<br />
//cria o scroll para efetuar as rolagens caso a imagem seja muito grande<br />
JScrollPane scroll = new JScrollPane();<br />
//adiciona o display dentro do scroll<br />
scroll.setViewportView(display);<br />
//adiciona o scroll dentro do frama<br />
frame.add(scroll);<br />
//define a operação padrão para o botão fechar do frame<br />
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<br />
frame.setSize(400, 400); //define o tamanho do frame<br />
frame.setVisible(true); //manda o frame ser exibido<br />
</code></p>
<p>Entre estes dois trechos de código, coloque a operação JAI de sua preferência&#8230; isso funcionou como ponto de partida para mim.</p>
<h2>Livros! (Update, dia 11/03/2010)</h2>
<p>Foi só falar que não tinha, que pipocaram links de livros de vários lugares. Como alguns foram por email, outros por comentários, vou listar eles aqui:</p>
<ul>
<li><a href="http://www.amazon.com/Building-Imaging-Applications-Java-Technology/dp/0201700743/ref=sr_1_2?ie=UTF8&amp;s=books&amp;qid=1268254333&amp;sr=8-2" target="_blank">Building Imaging Applications Java Technology</a></li>
<li><a href="http://www.amazon.com/Java-Media-APIs-Cross-Platform-Visualization/dp/0672320940/ref=sr_1_5?ie=UTF8&#038;s=books&#038;qid=1268254459&#038;sr=8-5" target="_blank">Java Media APIs: Cross Platform Visualization</a></li>
<li><a href="http://www.amazon.com/Digital-Image-Processing-Practical-Introduction/dp/0201596237/ref=sr_1_13?ie=UTF8&#038;s=books&#038;qid=1268254459&#038;sr=8-13" target="_blank">Digital Image Processing: Practical Introduction</a></li>
<li><a href="http://www.amazon.com/Digital-Image-Processing-Algorithmic-Introduction/dp/1846283795/ref=sr_1_1?ie=UTF8&#038;s=books&#038;qid=1268254459&#038;sr=8-1">Digital Image Processing: Algorithmic Introduction</a></li>
</ul>
<p><strong>Muito Obrigada pelas contribuições!</strong></p>
<p>Estou estudando a JAI agora, por isso espero ter mais posts sobre ela em breve. Interessou? <a href="http://www.imagesurvey.com.br/feed">Assine o RSS</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.imagesurvey.com.br/2010/03/como-eu-comecei-a-usar-a-jai/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

