Exemplo: Contagem de bovinos

Alcinei Mistico Azevedo (ICA-UFMG)

2021-09-06

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

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)

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)

im3=segmentation(im2,treshold = "otsu",selectHigher = FALSE,plot=TRUE)
#> The treshold by Otsu melhod is (O valor do limiar pelo etodo 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]
#>         m.cx       m.cy s.area
#> 1  131.08108  11.819820    111
#> 2  201.81416   7.938053    113
#> 3  273.61856  17.974227    194
#> 4  441.08252  18.606796    206
#> 5  565.81865  24.155440    193
#> 6  303.81461  31.280899    178
#> 7  467.07317  32.065041    123
#> 8  179.31579  34.098684    152
#> 9  373.01613  32.252688    186
#> 10 257.07317  34.531707    205
#> 11  57.42568  37.966216    148
#> 12 128.01709  48.709402    117
#> 13 233.79893  55.477212    373
#> 14  42.36364  46.924242     66
#> 15  46.13095  55.726190     84
#> 16 547.02924  54.614035    171
#> 17 484.11650  84.888350    206
#> 18 292.56684  81.951872    187
#> 19 359.20930  84.482558    172
#> 20 570.25466  89.838509    161
#> 21 100.08434 101.698795    166
#> 22 157.35204  95.285714    196
#> 23  87.98684 107.250000    152
#> 24 215.11429 116.450000    140
#> 25 413.68421 110.086124    209
#> 26  21.51095 113.510949    137
#> 27 334.64912 119.210526    171
#> 28  45.77372 129.569343    137
#> 29 563.31731 133.062500    208
#> 30 184.69697 145.777778    198
#> 31 107.66092 147.390805    174
#> 32 266.00431 152.465517    232
#> 33 383.30216 156.935252    139
#> 34 414.78469 154.234450    209
#> 35 500.43192 164.328638    213
#> 36  18.43312 169.050955    157
#> 37 478.58874 167.610390    231
#> 38 337.74359 172.410256    234
#> 39  84.81373 179.637255    102
#> 40 427.12755 179.469388    196
#> 41 293.12500 194.796875    128
#> 42 207.71698 194.051887    212
#> 43 551.38587 193.782609    184
#> 44 439.07759 200.099138    232
#> 45 494.48187 201.787565    193
#> 46 359.24171 212.767773    211
#> 47 107.08571 214.594286    175
#> 48 450.66667 217.413978    186
#> 49  47.79096 218.632768    177
#> 50 167.99375 223.506250    160
#> 51 457.10471 231.785340    191
#> 52 395.50360 243.086331    139
#> 53  40.43646 243.176796    181
#> 54 506.51724 247.921182    203
#> 55 416.60748 252.121495    214
#> 56 352.66667 252.338983    177
#> 57 470.87407 260.644444    135
#> 58 143.03889 264.377778    180
#> 59 197.52695 265.275449    167
#> 60 433.78125 273.375000    192
#> 61  76.65269 271.401198    167
#> 62 271.00000 274.825301    166
#> 63 130.73006 279.036810    163
#> 64 328.53614 280.765060    166
#> 65 411.64706 285.786096    187
#> 66  39.18116 287.884058    138
#> 67 271.02890 292.231214    173
#> 68 513.75243 294.902913    206
#> 69 160.58904 295.383562    146
#> 70 350.22280 298.658031    193
#> 71 457.72222 307.803030    198
#> 72 526.67816 318.678161    174
#> 73 600.29012 317.981481    162
#> 74 107.54268 320.103659    164
#> 75 143.11656 321.895706    163
#> 76 178.86842 328.973684    152
#> 77 504.80682 331.840909    176
#> 78  90.00694 331.687500    144
#> 79 407.02454 334.644172    163
#> 80 227.34356 336.582822    163
#> 81 468.80000 339.529412    170
#> 82  27.66667 341.827586     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,im4$measures[,1],im4$measures[,2],text ="o",
               cex =2 )

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