---
title: "Exemplo: Contagem de objetos"
author: "Alcinei Mistico Azevedo (ICA-UFMG)"
date: "`r Sys.Date()`"
output: rmarkdown::html_vignette
fig_caption: yes
vignette: >
  %\VignetteIndexEntry{Exemplo: Contagem de objetos}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)
```

# Introdução

Obrigado por utilizar o pacote `ExpImage`. Este pacote foi desenvolvido a fim de facilitar o uso da analise de imagens na obtenção de várias informações sobre os objetos que elas contém. Para a utilização do pacote é indispensável a instalação do pacote `EBImage`. Geralmente, este pacote pode ser instalado ao executar os seguintes comandos:

`if (!requireNamespace("BiocManager", quietly = TRUE))`

`install.packages("BiocManager")`

`BiocManager::install("EBImage")`

Porém se houver problemas na instalação sugerimos que consulte mais opções de instalação no site: https://bioconductor.org/packages/release/bioc/html/EBImage.html

Para instalar o pacote ´ExpImage´ basta utilizar o seguinte comando:

`install.packages("ExpImage")`

Convidamos a todos os usuários do ExpImage que venha conhecer nossos materiais didáticos sobre este e outros pacotes nos seguintes links: 

https://www.youtube.com/channel/UCDGyvLCJnv9RtTY1YMBMVNQ

https://www.expstat.com/

# Abrindo as imagens no R 

## Ativação dos pacotes
Após a instalação dos pacotes é necessário fazer sua ativação

```{r}
 library(EBImage)
library(ExpImage)
```

## Abrindo as imagens.
Para abrir as imagens pode-se inicialmente indicar a pasta de trabalho onde a imagem se encontra com a função `setwd`. E, posteriormente, abrir a imagem com a função `read_image`.

Neste caso, poderiam ser utilizados comandos como esses:

`#Apagar memoria do R`

`remove(list=ls())`

`#Indicar a pasta de trabalho`

`setwd("D:/Backup Pendrive/")`

`im=read_image("Imagem.jpeg",plot=TRUE)`

Neste exemplo utilizaremos uma imagem contida no banco de dados do pacote.

```{r}
# Obtendo o endereço da imagem de exemplo
end=example_image(2)
im=read_image(end,plot=TRUE)
```

Em algumas situações é interessante diminuir a resolução das imagens, pois torna-se possível reduzir o esforço computacional sem perdas expressivas na precisão das medidas a serem obtidas.

```{r}
##Diminuir a resolucao (tamanho da imagem)
im2=resize_image(im,w=1000,plot=TRUE)

```


Após criação do objeto contendo a imagem (im) precisamos proceder alguma metodologia de segmentação. 

## Metodologias de segementação

Varias metodologias de segmentação podem ser utilizadas. Uma opção é o método do limiar. Para isso, é necessários escolher um índice ou banda que proporcionará maior contraste entre as sementes (foreground) e o fundo (background).

```{r}
#Selecionando o melhor indice para a segmentacao
r=gray_scale(im2,method = "r",plot=T)
g=gray_scale(im2,method = "g",plot=T)
b=gray_scale(im2,method = "b",plot=T)
```

Como foi possível observar, quando se utilizou a banda de azul foi possível obter melhor contraste entre a folha e o fundo. Logo, podemos considerar essa banda como a melhor para fazer o processo de segmentação.

Outra opção de explorar outros possíveis índices é por meio do seguinte comando:

```{r}
plot_indexes(im,NumberCores=2)
```


A segmentação pode ser feita considerando-se um limiar. Ou seja, um valor a partir do qual os pixels serão consideradas como background ou foreground. O melhor valor de limiar pode ser obtido pela tentativa e erro:

```{r}
MatrizSegmentada=segmentation(b,treshold = 0.20,fillHull = F,selectHigher = T,plot=T)
MatrizSegmentada=segmentation(b,treshold = 0.40,fillHull = F,selectHigher = T,plot=T)
MatrizSegmentada=segmentation(b,treshold = 0.60,fillHull = F,selectHigher = T,plot=T)
MatrizSegmentada=segmentation(b,treshold = 0.80,fillHull = F,selectHigher = T,plot=T)
```

Como foi possível observar, dependendo do valor de limiar escolhido, pode não aparecer toda a folha ou ter muitos ruídos.

Outra opção é considerar um treshold obtido pelo método de otsu da seguinte forma:

```{r}
MatrizSegmentada=segmentation(r,treshold = "otsu",fillHull = F,selectHigher = T,plot=T)
```

Mas neste caso o melhor é considerar o limiar de 0.40

```{r}
plot_image(b,col = 3)
MatrizSegmentada=segmentation(b,treshold = 0.4,fillHull = F,selectHigher = F,plot=T)

```

Como é possível ver, foi feita a segmentacao separando o que é folha e o que não é. Dessa forma, podemos separar o que é "folha + ovos" e o que não é, preechendo os espaços em branco dentro da folha da seguinte forma:

```{r}
MatrizSegmentada=segmentation(b,treshold = 0.4,fillHull = T,selectHigher = F,plot=T)

```

Agora que temos apenas os pixels correspondente à "folha + ovos" podemos substituir o background por outra cor, como a preta:

```{r}
im3=extract_pixels(im2,target =MatrizSegmentada,valueTarget =1,valueSelect = c(0,0,0),plot=T )
```

Agora, se fazermos outra segmentação apenas para selecionar os pixeis claros, conseguiremos obter os pixels correspondentes apenas aos ovos.

Para isso, vamos ver qual é a melhor banda para considerarmos na segmentação:

```{r}
r=gray_scale(im3,method = "r",plot=T)
g=gray_scale(im3,method = "g",plot=T)
b=gray_scale(im3,method = "b",plot=T)
```

Como pode-se observar, o canal "azul" continua sendo melhor para a segmentação dos ovos.

Logo, vamos fazer outra segmentação para obter os pixeis correspondentes apenas aos ovos

```{r}
MatrizSegmentada2=segmentation(b,treshold = 0.50,fillHull = T,selectHigher = T,plot = T)

```

Ótimo, conseguimos agora obter o número de objetos pela seguinte função:

```{r}
Medidas=measure_image(MatrizSegmentada2)
Medidas$ObjectNumber
```

Agora se estiver com dúvida que este valor está correto é só contar, rsrsrsrs.

Apenas para verificar se os pontos correspondem a todos os ovos é só substituir na imagem os pixeis correspondentes aos ovos por outra cor:

```{r}
im4=extract_pixels(im2,target =MatrizSegmentada2,valueTarget =0,valueSelect = c(1,0,0),plot=T )
```

Para a melhor visualização podemos apresentar as imagens lado a lado:

```{r}
im5=join_image(im2,im4,plot = TRUE)
```
