Exemplo: Contagem de bovinos

Alcinei Mistico Azevedo (ICA-UFMG)

2024-05-07

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

 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.

# Obtendo o endereço da imagem de exemplo
end=example_image(11)
im=read_image(end,plot=TRUE)

Vamos verificar qual é o melhor índice para fazer a segmentação.

plot_indexes(im,NumberCores=2)

O Índice ExG é uma ótima opção para a segmentação, pois os bovinos se destacaram bastante em relação ao solo.

#Criando o objeto com o índice
im2=gray_scale(im,method = "ExG",plot=T)

Agora podemos fazer a segmentação. Para isso utilizaremos o algorítimo de otsu a fim de selecionar os pixels de menores valores (foregrounds)

max(c(im2@.Data))
#> [1] 1
im3=segmentation(im2,treshold = "otsu",selectHigher = FALSE,plot=TRUE)
#> [1] "The threshold by Otsu method is (O valor do limiar pelo metodo otsu e): 0.5605"

A partir dessa imagem segmentada podemos contar o número de objetos.

im4=measure_image(im3)

#Numero de objetos
im4$ObjectNumber
#> [1] 149

#Tamanho em pixels de cada objeto
im4$measures[,3]
#>   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20 
#> 111   6  48 113   4   3  45 194   1 206   1   1   1 193 178 123 152 186 205 148 
#>  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40 
#> 117 373   1  66   1   1  84   1   1 171   2   1 206 187 172 161   2 166 196 152 
#>  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60 
#>   1 140 209 137 171 137   2 208   3   2 198 174 232 139 209   2   1   1   4   4 
#>  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80 
#> 213 157   3 231   2   8   2   3   1   1 234 102   5 196   1 128   1   2 212 184 
#>  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100 
#>   1   6 232   1   1 193   1 211   1 175 186   1 177   1   5 160   1   1   1   4 
#> 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 
#>   1 191   8 139 181 203 214   1 177 135 180 167 192 167 166 163   1   1 166 187 
#> 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 
#> 138   3   1 173 206  30 146 193 198   5   8   2 174 162 164 163   2   4   1 152 
#> 141 142 143 144 145 146 147 148 149 
#>   5 176 144 163 163 170  87   2   1

Como pode-se observar, o número de objetos é muito superior ao número de animais. Isso é uma consequência do ruido. Podemos ver na terceira coluna da tabela anterior o número de pixels de cada objeto. Os menores valores de área são os ruidos. Logo, podemos selecionar um valor a partir do qua não consideraremos ruídos. Ao olhar o conjunto de dados podemos ver que um ruído de 50 pode permitir selecionar apenas os animais.

im4=measure_image(im3,noise=50)

im4$measures[,1:3]
#>          x       y area
#> 1  131.081  11.820  111
#> 2  201.814   7.938  113
#> 3  273.619  17.974  194
#> 4  441.083  18.607  206
#> 5  565.819  24.155  193
#> 6  303.815  31.281  178
#> 7  467.073  32.065  123
#> 8  179.316  34.099  152
#> 9  373.016  32.253  186
#> 10 257.073  34.532  205
#> 11  57.426  37.966  148
#> 12 128.017  48.709  117
#> 13 233.799  55.477  373
#> 14  42.364  46.924   66
#> 15  46.131  55.726   84
#> 16 547.029  54.614  171
#> 17 484.117  84.888  206
#> 18 292.567  81.952  187
#> 19 359.209  84.483  172
#> 20 570.255  89.839  161
#> 21 100.084 101.699  166
#> 22 157.352  95.286  196
#> 23  87.987 107.250  152
#> 24 215.114 116.450  140
#> 25 413.684 110.086  209
#> 26  21.511 113.511  137
#> 27 334.649 119.211  171
#> 28  45.774 129.569  137
#> 29 563.317 133.062  208
#> 30 184.697 145.778  198
#> 31 107.661 147.391  174
#> 32 266.004 152.466  232
#> 33 383.302 156.935  139
#> 34 414.785 154.234  209
#> 35 500.432 164.329  213
#> 36  18.433 169.051  157
#> 37 478.589 167.610  231
#> 38 337.744 172.410  234
#> 39  84.814 179.637  102
#> 40 427.128 179.469  196
#> 41 293.125 194.797  128
#> 42 207.717 194.052  212
#> 43 551.386 193.783  184
#> 44 439.078 200.099  232
#> 45 494.482 201.788  193
#> 46 359.242 212.768  211
#> 47 107.086 214.594  175
#> 48 450.667 217.414  186
#> 49  47.791 218.633  177
#> 50 167.994 223.506  160
#> 51 457.105 231.785  191
#> 52 395.504 243.086  139
#> 53  40.436 243.177  181
#> 54 506.517 247.921  203
#> 55 416.607 252.121  214
#> 56 352.667 252.339  177
#> 57 470.874 260.644  135
#> 58 143.039 264.378  180
#> 59 197.527 265.275  167
#> 60 433.781 273.375  192
#> 61  76.653 271.401  167
#> 62 271.000 274.825  166
#> 63 130.730 279.037  163
#> 64 328.536 280.765  166
#> 65 411.647 285.786  187
#> 66  39.181 287.884  138
#> 67 271.029 292.231  173
#> 68 513.752 294.903  206
#> 69 160.589 295.384  146
#> 70 350.223 298.658  193
#> 71 457.722 307.803  198
#> 72 526.678 318.678  174
#> 73 600.290 317.981  162
#> 74 107.543 320.104  164
#> 75 143.117 321.896  163
#> 76 178.868 328.974  152
#> 77 504.807 331.841  176
#> 78  90.007 331.688  144
#> 79 407.025 334.644  163
#> 80 227.344 336.583  163
#> 81 468.800 339.529  170
#> 82  27.667 341.828   87

#Numero de objetos
im4$ObjectNumber
#> [1] 82

Para conferir se este número de animais está correto podemos marcar na imagem as coordenadas de cada animal, considerando só dados das duas primeiras colunas do conjunto de dados.

plot_meansures(im,measurements = im4,pch=1,
               cex =2 )

Como podemos ver, todos os animas foram marcados. Logo, a contagem dos animais está correta.