# ImageJ

O ImageJ é um programa de computador de domínio público, feito em Java destinado a processamento de imagens. Ele foi desenvolvido no National Institutes of Health. O ImageJ foi feito para ser um programa de arquitetura aberta que pode ser expandido via Java en:plugins e macros.
ImageJ pode rodar em Microsoft Windows, no classic Mac OS, macOS, Linux, e no Sharp Zaurus PDA, e o código fonte é de livre acesso.
O seu principal desenvolvedor, Wayne Rasband, se aposentou no National Institute of Mental Health em 2010, mas continua contribuindo para o desenvolvimento do software, que por ser de domínio público com o código fonte acessível, permite o desenvolvimento compartilhado por pessoas de todo o mundo.
O ImageJ possibilita a exibição, edição, análise, processamento além da facilidade em salvar e imprimir imagens de 8 bits, 16 bits e 32 bits. Com ele também é possível fazer a leitura de vários formatos de imagem, bem como TIFF, GIF, JPEG, BMP, DICOM, FITS e “crus”. O programa suporta “pilhas” com uma série de imagens que compartilham uma única janela. Como o software trata-se de vários segmentos, operações classificadas como demoradas como a leitura de um arquivo de imagem, pode ser executável em paralelo com outras operações.
Em razão de sua grande adaptabilidade – sendo esta, inclusive, uma das pedras fundamentais de sua elaboração -, encontra-se atualmente na internet diversas variações do ImageJ sendo utilizadas para os mais variados propósitos, adotando características únicas e muito úteis para profissionais e entusiastas do processamento de imagem. Dentre estas, cita-se o ImageJ2 - ou ImageJDev , uma nova versão da arquitetura iniciado em dezembro de 2009 e focada no trato de dados de imagem multidimensionais, contendo dentre suas funcionalidades o recurso de atualização automática e melhorada capacidade de desenvolvimento -, o Fiji – apenas um pacote de expansão do ImageJ convencional, de uma única vez plugins muito utilizados -, e o AstroImageJ – versão do software contendo plugins e macros específicos para o trato de imagens astronômicas.

## História

Em 1987, o programador Wayne Rasband da Research Services Branch (RSB), da NIH, lançou um programa de análise de imagem livre, chamado NIH Image, com o objectivo de permitir aos utilizadores desenvolver novos aplicativos, para as diversas áreas de análise de imagem. Este programa foi desenvolvido para o sistema operativo da Mac. Com o aumento do número de utilizadores houve a necessidade de desenvolver o programa para o sistema operativo da Microsoft, sendo este realizado pela empresa Scion Corporation. No entanto, esta adaptação não foi satisfatória, pois continha muitos “bugs” e era paga, não dando a possibilidade da comunidade de utilizadores de a corrigir. O aumento de utilizadores da Microsoft na comunidade científica e o aparecimento da linguagem de programação Java, fizeram com que o Wayne Rasband desenvolve-se um programa idêntico ao NIH Image, mas que pudesse ser utilizado nos diferentes sistemas operativos. A este novo programa o autor chamou de ImageJ, para manter a ligação ao NIH Image, com o “J” a indicar o desenvolvimento em Java. O primeiro lançamento foi em 23 de setembro de 1997, com a versão 0.50 e, neste momento, está na versão 1.51k, lançado no dia 1 de Março de 2017.

## Principais funcionalidades

O ImageJ tem funções normais de um programa de processamento de imagens, desde funções simples como as de manipulação de arquivo, passando por funções mais simples de processamento da imagem, a funções mais elaboradas de medição de parâmetros, filtragens etc. Com ele você pode trabalhar com uma imagem colorida ou em nível de cinza, e usar diversos formatos de imagens como o TIFF, o PNG, o GIF, o JPEG, o formato BMP, DICOM, FITS e muitos outros. O ImageJ permite também que você trabalhe com um sequência, ou pilhas, além de canais de cores.
Outro artifício de especial interesse disponível no software é sua ampla gama de ferramentas voltadas à filtragem e processamento direto de imagens, tornando o procedimento mais simples que o observado através de outros meios.
Dentre as muitas metodologias disponíveis, destaca-se: o filtro de suavização – borra a imagem utilizada ou a seleção ao substituir cada pixel pela média de sua vizinhança -, o filtro de aguçamento – técnica oposta à de suavização, visando destacar elementos presentes na imagem ou seleção -, detecção de bordas, detecção de máximo – encontra o ponto máximo em uma imagem, servindo de ferramenta muito útil em técnicas de clusterização -, tratamento de contraste – atuando sobre o histograma da imagem selecionada, através do alongamento ou equalização -, ruídos – permitindo ao usuário adicionar ou suavizar os mais variados tipos de ruído em uma imagem -, produção de sombras, binarização, entre outros.
Exemplos de funções de processamento de imagens disponíveis no ImageJ:

### Histograma

O histograma, também conhecido como distribuição de frequências, é a representação gráfica em colunas ou em barras (retângulos) de um conjunto de dados previamente tabulado e dividido em classes uniformes ou não uniformes. No ImageJ ele mostra a frequência com que as cores aparecem na imagem utilizada.Um histograma é um gráfico de frequência com o objetivo de demonstrar como um determinado dado está distribuído em uma amostra, população, experimento, dentre outros elementos de analise, medindo o número de ocorrência desse determinado dados no meio onde é analisado. É utilizado nas mais variadas áreas para de levantar infinitos tipos de dados e com isso servir como auxilio nas tomadas de decisões pelos devidos responsáveis. Exemplos de aplicações muito usuais estão em setores administrativos, que tendem a tomar decisões para ampliar a produção, melhorar rendimento, estimular os colaboradores, no campo da computação é utilizado no processamento de imagens, determinando cores distorções, padrões, geometria, luminosidade etc.
No caso aplicado ao ImageJ o histograma calcula e exibe a distribuição dos níveis de cinza na imagem, seleção, cenas. No eixo horizontal (X; i; abscissa), estão representados os variados níveis de cinzas encontrados na imagem, logo no eixo vertical (Y, j, ordenadas) o número de pixels referente a cada nível de cinza no eixo horizontal. Analisando a imagem do histograma acima (a mesma já está em 8-bits),notamos algumas informações que o mesmo nos oferece, sendo elas, o tamanho da imagem em pixels, a quantidade de pixels (Count), média (Mean) correspondente a distribuição de 0 a 255, desvio padrão (StdDev), o valor mínimo, o valor máximo, a moda e o número de pixels que contem essa moda (Mode) e logo abaixo do gráfico uma escala em degrade da maior concentração de cinza até a menor. Ao clicar no comando List (Lista), nos é apresentada uma tabela com duas colunas e 256 linhas com os determinados níveis de cinza e a quantidade de pixels encontrados com esse valor. Algumas funções de macro como getHistogram e Plot.getValues podem ser usadas em conjunto para obtenção de valores e dados de contagem ao clicar no botão lista.
* Imagem em 8-bits
* Histograma da Imagem ao lado em níveis de cinza

### Perfil de uma linha

Nessa funcionalidade o ImageJ mostra através de um gráfico a cor de cada pixel na linha marcada sobre a imagem utilizada. É possível andar com essa linha na imagem.

### Pseudocor

O processamento de imagem em pseudocores consiste em atribuir cores a valores de cinza om base em determinados critérios. O termo pseudo ou falsa cor é utilizados para diferenciar o processo de atribuir cores a imagem monocromáticas a partir dos processos associados a imagem de cor verdadeira. A principal utilização das pseudocores é na visualização interpretação humana de eventos, em tons de cinza, em uma imagem ou sequencia de imagens.

### Corte

Utilizada para retirar um pedaço de uma imagem, seja para se trabalhar somente nele ou para removê-lo da imagem a ser trabalhada. No ImageJ existem várias maneiras de se realizar isso, entre elas estão: a opção Cut, Crop, Clear e Clear Outside.

### Inversão de preto e branco

Em alguns casos se faz necessária a utilização da ferramenta de inversão de cores, que troca os tons de preto por tons de brancos correspondentes ou vice e versa. Dessa forma, dependendo da imagem a ser trabalhada, podem-se obter mais detalhes ou até mesmo gerar uma facilitação em sua análise com o uso dessa funcionalidade.
Primeiramente, para que seja possível o uso de tal ferramenta no ImageJ é necessário converter a imagem para 8 bits em Image – Type – 8-bit, após feita essa etapa pode-se realizar a inversão em Image – Lookup Tables – Invert LUT.

### Binarização

É uma importante ferramenta para o processamento de imagens, e um passo fundamental para o processo de segmentação, ou retirada do objeto em observação do seu fundo.

### Ajuste de contraste e iluminação

Torna possível o controle do contraste e da iluminação através da opção Brightness/Contrast, onde é mostrado o histograma da imagem e tem-se as opções de modificar a faixa de cores que se quer trabalhar.

### Filtragem espacial

em processamento digital de imagem algumas operações são feitas trabalhando com os valores do pixel da vizinhança de um determinado pixel e os correspondentes valores de uma sub imagem tem as mesmas dimensões de sua vizinhança.Tal resultado é chamado de filtro o máscara.
Filtros usados no domínio espacial operam diretamente nos pixels da imagem a notação desta operação é dada por:
g(x.y)=T[f(x.y)],onde f(x,y) corresponde a imagem entrada, e g(x,y) a imagem processada pelo filtro T.
O processo consiste em mover o filtro ponto a ponto da ponto da imagem.Em cada ponto, a resposta do filtro é calculada segundo uma função pre-determinada.
os filtro podem ser divididos em duas classes:
Lineares- que são aqueles que suavizam e realçam detalhes da imagem,e reduzem os ruídos sem alterar o nível de cinza médio da imagem
Filtragem em frequência
Esse tipo de filtro é muito utilizado para a retirada de ruídos em altas ou baixas frequências. Para se trabalhar no domínio da frequência em imagens, normalmente se utiliza a transformada de Fourier. No ImageJ é possível obter a transformada de Fourier através da opção FFT.

### Operações de imagens

Através da opção Image Calculator é possível realizar diversas operações com duas imagens, como a soma, subtração, multiplicação, divisão, diferenciação, copia, operação lógica AND, OR e XOR, entre outras.

### Identificação de bordas

Utilizando a opção Find Edges é possível obter as bordas de um objeto em uma imagem. Quando utilizada, as bordas são marcas e tudo que não for considerado borda é retirado da imagem.

### Contagem de partículas

Através da opção Analyse Particles é possível realizar a contagem de partículas de uma imagem, sendo possível delimitar a área mínima e a circularidade das partículas a serem contadas, também é possível modificar a forma de saída dos resultados.

### Definição de escala

Essa funcionalidade permite ao usuário definir mensurar com relativa exatidão o dimensionamento de objetos presentes em determinada imagem partindo da existência de uma escala conhecida predeterminada, de forma a possibilitar a conversão de um comprimento em pixels em metros ou centímetros, por exemplo.
Para tanto, deve-se inicialmente fazer uso da ferramenta de traçar linhas para determinar um traçado que corresponda a uma distância conhecida. Logo após, basta escolher a opção de “Definição de escala”, preencher os campos requisitados com a magnitude da distância conhecida, a unidade métrica e selecionar o “Ok”.

### Outros

Além de muitas outras contribuições presentes para serem baixadas que são denominadas de plugins e macros.

## Plugins

O ImageJ foi ampliado com milhares de plugins: componentes de software para fins especiais que estendem a funcionalidade básica do ImageJ, como por exemplo, oferecendo comandos adicionais por meio de entradas de menu.
Quase todos os aspectos do ImageJ são plugáveis, o que significa que plugins podem ser fornecidos para executar funções específicas. O ImageJ precisa apenas saber quais operações estão disponíveis, e depois, quando o programa estiver em execução, as opções sobre como concluir uma operação solicitada serão determinadas pelos plugins disponíveis no momento.
Um plugin do ImageJ nada mais é do que uma classe Java com a anotação @Plugin. As classes anotadas dessa maneira são automaticamente encontradas e indexadas no tempo de execução, quando o aplicativo é iniciado por um usuário.
Estes plugins, em geral, são distribuídos pelo ImageJ Updater, uma ferramenta que instala e atualiza os pacotes (macros, plugins, bibliotecas) de forma automática, sendo compatível com domínios de terceiros, o que o torna configurável para qualquer site de atualização. Nos casos em que o Plugin com a aplicação desejada não esteja disponível no ImageJ Updater, é possível realizar o download e instalação do mesmo manualmente através do site oficial do ImageJ, na comunidade de utilizadores, e demais fontes online.

### PIV analyser

Este plugin do ImageJ realiza análise de velocimetria por imagem de partículas iterativa (Particle Image Velocimetry). Basicamente, um par de imagens é dividido em regiões menores (janelas de interrogação). A correlação cruzada entre essas sub-regiões de imagens mede o fluxo óptico (deslocamento ou velocidade dos objetos) dentro do par de imagens. Diminuindo progressivamente o tamanho da janela de interrogação, uma melhor resolução de PIV pode ser alcançada.
Dois métodos de correlação de imagem foram implementados para a medição do fluxo óptico. Pode-se usar o método de correlação cruzada convencional, que compara duas janelas de interrogação com o mesmo tamanho; ou pode-se usar o método de correspondência de modelo com o algoritmo de coeficiente de correlação normalizado, em que a janela de interrogação é comparada com uma janela de pesquisa maior.
O resultado da análise de PIV será exibido como uma plotagem vetorial e salvo em formato tabular de texto simples contendo todo o resultado da análise. Este plugin também fornece uma função de plotagem para visualizar os dados vetoriais com codificação de cores selecionada.
Este plugin foi originalmente desenvolvido para medir o campo de deslocamento da Microscopia de Força de Tração (TFM). Pode ser de alguma forma rudimentar em comparação com outro programa PIV especializado (como JPIV, mpiv, openPIV. ... etc.). No entanto, a implementação como o plugin ImageJ o torna mais disponível para o público em geral e mais fácil de combinar com outras tarefas de processamento de imagem.

### RATS (Robust Automatic Threshold Selection)

Baseia-se no trabalho de M.H.F. Wilkinson e outros, e estabelece limiares regionalizados para uma imagem em escala de cinza onde as regiões são estabelecidas usando a arquitetura quadtree recursiva. Em cada uma das regiões mais baixas da quadtree, o limite é calculado como a soma dos pixels originais ponderados pelos pixels do gradiente.
O Threshold calculado em cada região é necessário para atender aos critérios mínimos - esses critérios são determinados pelo usuário como uma estimativa de ruído (sigma) e um fator de escala (lambda). O usuário também pode selecionar o tamanho mínimo da região. Os limites para toda a região são então interpolados (bilineares) em toda a imagem. Em geral, os melhores valores para cada um dos três parâmetros são determinados por tentativa e erro para um determinado conjunto de imagens.
A imagem da esquerda mostra a caixa de diálogo na qual o usuário é solicitado.
THRESHOLD DO RUÍDO: Uma estimativa do ruído. Estime o ruído selecionando uma parte de "fundo" da imagem e usando ImageJ para determinar o desvio padrão dos valores de cinza. Estranhamente, valores mais baixos produzem partículas menores em geral. (veja na referência, o padrão é 25).
FATOR DE LAMBDA: Um fator de escala. Valores mais altos produzem partículas maiores. (veja na referência, o padrão é 3).
TAMANHO DE FOLHA DE MIN (pixels): O menor folheto permitido (o padrão é 5 níveis de quadtrees, então o valor padrão é computado em tempo real baseado na largura e altura da imagem de entrada).
VERBOSE: Se configurado, envie as mensagens informativas na janela de registro (o padrão é falso). As imagens do centro e da direita mostram uma imagem de exemplo de seu aprimoramento de borda com as quadtrees aninhadas para apenas um quadrante sobreposto.

## Exemplos do uso do ImageJ
### Binarização

Veja alguns passos para realizar este processamento:
Abrindo uma imagem:
Transformar a imagem em 8-bit:
Usar a função Threshold:
Ajuste do Threshold:

### Medições diversas em objetos

Introdução:

### Extração de características

Com a ferramenta "Analyse Particles" presente no ImageJ, é possível a extração de características de diferentes objetos apresentados em uma imagem.
Preparação da imagem: Para fazer uso dessa ferramenta é necessário que a imagem esteja segmentada, dessa forma, foi realizado as seguintes etapas: Transformação para 8-bits, Aplicação de filtro gaussiano e aplicação de Threshold. As figuras a seguir mostram os resultados desses processos.
Aplicação da ferramenta: De posse da imagem binarizada, a ferramenta pode ser acessada pelo menu: "Analyze" -> "Analyse Particles". Realizando as seguintes configurações: Size: 1000-infinity; Circularity: 0 - 1; Show: Outlines. Obtém-se os resultados mostrados nas figuras abaixo.
Informações Obtidas: Após o processo, a ferramenta gera diversas informações a respeito dos objetos encontrados. A figura abaixo mostra tais informações.
Através dessa ferramenta, o ImageJ é capaz de distinguir diferentes geometrias, o que pode ser aplicado em sistemas de reconhecimento de formas para separação de objetos, reconhecimento de pessoas ou animais, detecção de falhas ou erros em peças produzidas, entre outras aplicações. Esse método, apesar de não demonstrar perfeitamente o contorno dos objetos das imagens, possui uma alta precisão, o que facilita na comparação com outros objetos e na detecção de objetos de mesma simetria. Outra maneira de se analisar os resultados é através dos valores obtidos nas tabelas apresentadas acima, comparando os valores de área, perímetro, entre outros parâmetros apresentados nesses resultados.

### Transformada de Fourier

Com o ImageJ também é possível aplicar transformada de Fourier, este filtro tem a principal função de filtrar ruídos em imagens. Ele funciona transformando a imagem do domínio espacial para o domínio da frequência, sendo que a imagem gerada no domínio da frequência pode ser convertida novamente para uma imagem no domínio do espaço através da Transformada Inversa de Fourier. Como indicado a seguir:
Além de podermos fazer essa transformação do domínio do espaço para o domínio da frequência e do domínio da frequência para o domínio do espaço, podemos ainda aplicar filtros, tais como, passa alta, passa baixa e passa faixa, como demonstrado a seguir:

## Detecção de bordas

Ao se fazer análise de imagens, por muitas vezes é de extrema importância a detecção de bordas, já que ela é essencial na identificação da estrutura e das propriedades dos objetos em uma cena, sendo requisito para o uso de diversas ferramentas do processamento de imagens. É caracterizada como as mudanças bruscas em determinados pontos da imagem, localizando-se entre os limites entre duas diferentes regiões em uma figura. Usualmente é o primeiro passo realizado ao se recuperar informações de imagens.
Graças a sua grande importância, o imageJ oferece algumas ferramentas para a detecção de bordas. No exemplo a seguir foi usado uma dessas ferramentas cujo funcionamento baseia-se na utilização de derivadas horizontais e verticais que conseguem detectar mudanças bruscas na intensidade e assim localizar as bordas. Essas derivadas são unidas no final do processo utilizando a raiz da soma de seus quadrados, fazendo com que o lugar onde foram encontradas mudanças expressivas de intensidade fiquem realçadas.
Para o exemplo abaixo, primeiramente, transformou-se a imagem original em 8 bits, seguindo os seguintes comandos: Image->Type->8 bits. Em seguida aplicou-se o filtro de borda, seguindo os passos: Process-> Find edges. Assim obteve-se a seguinte imagem:
* Imagem original
* Imagem após a aplicação da ferramenta de detecção de bordas
Como pode ser observado, o filtro de borda obteve grande sucesso. Isso se deve principalmente a qualidade de iluminação na imagem bem como ao fato das cores estarem bem definidas. No exemplo abaixo será apresentado um caso onde o filtro não obteve um bom resultado. Novamente, repetiu-se os mesmos processos mencionados acima de modo a encontrar as bordas da imagem:
* Imagem original
* Imagem após a aplicação da ferramenta de detecção de bordas
Como pode ser visto, a falta de iluminação adequada comprometeu o pleno funcionamento da ferramenta. Na imagem é possível perceber regiões em que não foram detectadas as bordas ou mesmo lugares onde as bordas apresentaram descontinuidades, comprometendo a utilização de ferramentas posteriores. Portanto, é possível concluir que para o bom funcionamento da ferramenta de detecção, a iluminação é um fator essencial, sendo em alguns casos necessário um pré-processamento da imagem antes da aplicação do procedimento de detecção de bordas.