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
library(FIELDimageR)library(raster)
EX.SC<-stack("odm_orthophoto.tif")plotRGB(EX.SC, r = 1, g = 2, b = 3)#First crop, select area from orto (Talhao) could be shapefile from QGISEX.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.532EX.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 pointsEX1.SC$objectReject[[4]] # Shows 2 artifacts that were rejected (6 and 9 from previous example)EX1.SC$fieldCount
Olá Leonardo,
Poderia enviar uma imagem desenhada com o que você deseja para que eu entenda o que está falando?
Obrigado
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
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
# 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
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
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")
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...