Realiazar contagem por outro indice como mascara

31 views
Skip to first unread message

Leonardo Mártyres

unread,
May 6, 2020, 8:34:00 PM5/6/20
to FIELDimageR: A R package to analyze orthomosaic images from field trials.
Olá Felipe, primeiramente parabéns por essa excelente ferramenta, abriu muitas possibildades para trabalho/pesquisa com diferentes culturas não só com batatas rsrs

Estamos com pesquisas em palma em modulos de 25ha, na maioria do tempo não há uma roçagem em sua totalidade ou mesmo parcial, devido a isso na hora de aplicar a mascara HUE para realizar a marcação e contagem fica não muito preciso, haveria com utilizar qualquer outro indice para a mascara? no caso o BI ou SCI e no caso a remoção do fundo "verde" digamos assim.

Outra situação seria utilizar um shape externo e utilizá-lo, já sabemos que em determinado talhão o angulo é x para a rotação, teria como passar a rotação por uma tabela.csv com o nome do talhao e angulo,? Desta forma poderiamos ter mais um ganho de tempo em demarcação e processamento. Anexo contem as 2 demarcações manuais, uma para seleção do talhão digamos assim, e a outra para correção e seleção da área a ser contabilizada.

Por fim, não consegui a resposta como no seu vídeo, o qual mostra uma resposta com a contagem por cada linha: standCount não funciona!

Mais uma vez agradeço pela excelente ferramenta e atenção.
croparea.png
CropfromODM.png
fieldcount_1.9.png
Markfromhue.png
PlotShape.png
proposemak.png
rotated.png

Leonardo Mártyres

unread,
May 6, 2020, 10:05:52 PM5/6/20
to FIELDimageR: A R package to analyze orthomosaic images from field trials.
Olá Felipe, me ocorreu o seguinte, haveria como realizar o count através do DSM? Ou seja, poderia se obter os valores da transição do solo e da copa, e aplicando algum indice poder acessar as árvore individualmente e realizar a contagem?

fmatias

unread,
May 7, 2020, 1:01:19 AM5/7/20
to FIELDimageR: A R package to analyze orthomosaic images from field trials.

Olá Leonardo, obrigado por entrar em contato.

Fico grato em saber que FIELDimageR está ajudando em seus trabalhos...!!!

 

Respondendo as suas perguntas:


1. Haveria com utilizar qualquer outro índice para a máscara?

R: Sim, esta é a forma correta de se fazer, testar outros índices. Você deve rodar a imagem original (com o solo) usando vários índices. Em seguida deve selecionar aquele que melhor identifique a copa das arvores. Uma vez identificado este índice a função hist() pode ser usada para encontrar o ponto de corte. Você vera que alguns picos serão formados no histograma, então você deve usar o valor entre esses picos como corte. Por favor veja o exemplo usando o índice BGI no link: https://github.com/OpenDroneMap/FIELDimageR#P6

 

EX1.Indices.BGI<- fieldIndex(mosaic = EX1.Rotated, index = c("BGI")) # Please, test to other index as SI, VARI, etc.

dev
.off()
hist
(EX1.Indices.BGI$BGI) # Image segmentation start from 0.7 (soil and plants)

EX1
.BGI<- fieldMask(mosaic = EX1.Rotated, Red = 1, Green = 2, Blue = 3,

                   index
= "BGI", cropValue = 0.7, cropAbove = T)



2. Outra situação seria utilizar um shape externo e utilizá-lo ...

R: Sim, você pode usar um shape externo feito por exemplo no QGIS conforme indicado no item 4 do link: https://github.com/OpenDroneMap/FIELDimageR#P20 . Para isso você devera usar a função readOGR() do pacote library(rgdal)


3. Já sabemos que em determinado talhão o angulo é x para a rotação, teria como passar a rotação por uma tabela.csv com o nome do talhao e angulo,? Desta forma poderiamos ter mais um ganho de tempo em demarcação e processamento. Anexo contem as 2 demarcações manuais, uma para seleção do talhão digamos assim, e a outra para correção e seleção da área a ser contabilizada.

R: Se eu entendi bem sua pergunta, acredito que você deve usar o parâmetro “theta” da função fieldRotate(). Se você sabe que o ângulo de rotação do talhão1 é 45 e do talhão2 é 55, então você pode colocar uma condicional em seu script, por exemplo:

 

talhao1=stack("talhao1.tif")
talhao2
=stack("talhao2.tif")
talhao
=c("talhao1","talhao2 ")

rotated
=list()

for(i in 1:length(talhao){
  mosaic
=talhao[i]
 
if(mosaic=="talhao1"){theta=45}
 
if(mosaic=="talhao2"){theta=55}
  rotated
[[i]]=fieldRotate(mosaic = get(mosaic), theta = theta)
}

names
(rotated)= talhao



4. Por fim, não consegui a resposta como no seu vídeo, o qual mostra uma resposta com a contagem por cada linha: standCount não funciona!

R: A partir da versão FIELDimageR 0.1.3 “standCount()” passou a se chamar “fieldCount()”. Isso, pois as pessoas estavam usando esta função para outros propósitos além de avaliar stand em campo, como por exemplo contar sementes e pólen. O vídeo foi feito antes desta mudança. Para mais informações, por favor verifique no link: https://github.com/OpenDroneMap/FIELDimageR#P7


5. Haveria como realizar o count através do DSM? Ou seja, poderia se obter os valores da transição do solo e da copa, e aplicando algum indice poder acessar as árvore individualmente e realizar a contagem?

R: Sim, você pode usar o DSM para fazer a máscara. No entanto essa máscara será por meio de um cálculo manual e não através de funções do pacote. Imagine que todos os valores acima de 320m de um DSM file fossem as copas das arvores (por exemplo, um terreno com altitude de 300m e arvores acima de 20m). Basicamente vc usaria o comando:

 

Mask=DSM>320

 

Isso geraria um arquivo de zeros (0) e uns (1) de ausência e presença, que você poderia usar como máscara em seu mosaico RGB. Desta forma, o próximo passo seria usar o parâmetro “mask” da função “fieldMask()”:

 

CHM.S <- fieldMask(RGB, mask = Mask, cropValue=0,cropAbove=T)

 

Obs: Este procedimento é mais complexo, pois você deve garantir que ambas as imagens têm as mesmas projeções “crs” e o mesmo ângulo de rotação. Também as vezes exigira adaptação no código ou scripts. Por isso recomendo encontrar um índice mais adequado para identificação das copas das suas arvores.

 

Espero que essas explicações tenham ajudado de alguma forma. Por favor, deixe me saber se conseguiu terminar suas análises.

 

Abraço,

Filipe Matias 

Message has been deleted

Leonardo Mártyres

unread,
May 7, 2020, 8:40:28 AM5/7/20
to FIELDimageR: A R package to analyze orthomosaic images from field trials.
Olá Felipe,
Agradeço muito pelo retorno e sua ajuda, segui as suas orientações e deu certo, compartilho o código que utilizei e algumas considerações.

No fieldCount ele usou a mascara e tudo ocorreu bem, contudo, como é uma copa meio garda-chuva  algum momento contou a mesma conforme via esses "braços", haveria como usar na mascara um ponto central radial? Ou seja, detectou a mascara -> criou o radial -> usar como ponto de contagem o radial?

Na mostragem ele exibe a mascara e sua contagem (bolas vermelhas), tem como mostrar a imagem e as bolas vermelhas? Exportar os montos marcados em shapfile?

Mais uma vez, parabéns pela excelente ferramenta e muito obrigado pela ajuda.

library(FIELDimageR)
library(raster)

EX.SC<-stack("odm_orthophoto.tif")
plotRGB(EX.SC, r = 1, g = 2, b = 3)
EX.SC<-aggregate(EX.SC, fact=4)
#First crop, select area from orto (Talhao) could be shapefile from QGIS
EX.Crop <- fieldCrop(mosaic = EX.SC,fast.plot=T) # For heavy images (large, high resolution, etc.) please use: fast.plot=T
#Rotate the area to become lines nearly Theta rotation: 68.532
EX.SC.Rotated<-fieldRotate(mosaic = EX.Crop, clockwise = F)
#EX.SC.Rotated<-fieldRotate(mosaic = EX.Crop,theta = 2.3)
#Second crop, select area from talhao (could be the same as first crop)
EX1.Crop <- fieldCrop(mosaic = EX.SC.Rotated)

# Choosing the index to remove the background:
EX1.Indices.BGI<- fieldIndex(mosaic = EX1.Crop, index = c("BGI")) # Please, test to other index as SI, VARI, etc.

dev.off()
hist(EX1.Indices.BGI$BGI) # Image segmentation start from 0.7 (soil and plants)

EX1.BGI<- fieldMask(mosaic = EX1.Crop, Red = 1, Green = 2, Blue = 3,
                    
                    index = "BGI", cropValue = 0.75, cropAbove = T)

# Building the plot shapefile (ncols = 1 and nrows = 7)
EX.SC.Shape<-fieldShape(mosaic = EX1.BGI,ncols = 1, nrows = 13)

EX1.SC<-fieldCount(mosaic = EX1.BGI$mask, 
                   fieldShape = EX.SC.Shape$fieldShape,
                   minSize = 0.6)

EX1.SC$objectSel[[4]] # Identifies 12 points
EX1.SC$objectReject[[4]] # Shows 2 artifacts that were rejected (6 and 9 from previous example)
EX1.SC$fieldCount


shape.png
mask.png
fieldCountNew.png

filipe inácio

unread,
May 7, 2020, 9:39:51 AM5/7/20
to FIELD...@googlegroups.com

Olá Leonardo, 

 

Poderia enviar uma imagem desenhada com o que você deseja para que eu entenda o que está falando?

 

Obrigado


Leonardo Mártyres

unread,
May 7, 2020, 10:29:05 AM5/7/20
to FIELDimageR: A R package to analyze orthomosaic images from field trials.
Ola felipe, seguem imagens (encaminho a ideia também, não precisa ser preenchido só o contorno ou ).
area.png
ideia.png

fmatias

unread,
May 7, 2020, 1:29:01 PM5/7/20
to FIELDimageR: A R package to analyze orthomosaic images from field trials.

Leonardo, veja se isso te ajuda:

 

point<-as.data.frame(EX1.SC$objectSel)
plotRGB
(EX1.BGI$newMosaic)
points
(point$x, point$y, pch=16, cex=1, col="blue") # Mude o valor do cex para aumentar o tamanho do ponto

 

Filipe


Leonardo Mártyres

unread,
May 13, 2020, 6:38:56 PM5/13/20
to FIELDimageR: A R package to analyze orthomosaic images from field trials.
Olá Filipe, me desculpe pela demora, estava em momento tenso por aqui.. utilizei o código e obtive o seguinte erro:

20      1.130 -9087437 3811377
> point<-as.data.frame(EX1.SC$objectSel)
Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,  : 
  arguments imply differing number of rows: 11, 20, 16, 25, 22, 14, 15, 17, 18, 13

O código coloquei na seguinte ordem.. onde seria o input do código?
# Building the plot shapefile (ncols = 1 and nrows = 7)

EX
.SC.Shape<-fieldShape(mosaic = EX1.BGI,ncols = 1, nrows =19)


EX1
.SC<-fieldCount(mosaic = EX1.BGI$mask,
                   fieldShape
= EX.SC.Shape$fieldShape,
                   minSize
= 0.6)


EX1
.SC$objectSel[[4]] # Identifies 12 points


point
<-as.data.frame(EX1.SC$objectSel)

plotRGB
(EX1.BGI$newMosaic)
points
(point$x, point$y, pch=16, cex=1, col="blue") # Mude o valor do cex para aumentar o tamanho do ponto



EX1
.SC$objectReject[[4]] # Shows 2 artifacts that were rejected (6 and 9 from previous example)
EX1
.SC$fieldCount


fmatias

unread,
May 14, 2020, 9:02:54 AM5/14/20
to FIELDimageR: A R package to analyze orthomosaic images from field trials.

Tranquilo Leonardo,

 

Tenha seu tempo, e lembrasse que tudo vai acabar bem. 

 

Cara, o código rodou no meu computador perfeitamente. Mas tente usar essa linha aqui:

 

points(EX1.SC$objectSel[[1]][,2], EX1.SC$objectSel[[1]][,3], pch=16, cex=2, col="red")

 

Deixe-me saber se funcionou para você.

 

Abs

Leonardo Mártyres

unread,
May 15, 2020, 11:09:27 PM5/15/20
to FIELDimageR: A R package to analyze orthomosaic images from field trials.
Olá Felipe,

Realmente era o que eu estava em mente, contudo, ao usar essa linha de comando só fica a primeira linha do topo marcada (picc1).

plotRGB(EX1.BGI$newMosaic)
#points(point$x, point$y, pch=16, cex=1, col="blue") # Mude o valor do cex para aumentar o tamanho do ponto
points
(EX1.SC$objectSel[[1]][,2], EX1.SC$objectSel[[1]][,3], pch=16, cex=1, col="red")

já quando uso o código anterior e altero o objectsel, teno a marcação no meio apenas(picc2).

point<-as.data.frame(EX1.SC$objectSel[[4]])

plotRGB
(EX1.BGI$newMosaic)
points
(point$x, point$y, pch=16, cex=1, col="blue") # Mude o valor do cex para aumentar o tamanho do ponto
Digite o código aqui...


picc2.jpeg
picc1.jpeg
Reply all
Reply to author
Forward
0 new messages