-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfieldMask.py
88 lines (71 loc) · 2.35 KB
/
fieldMask.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import numpy as np
import pandas as pd
import sys
import matplotlib.pyplot as plt
import rasterio
from skimage.transform import rescale
import cv2
import geopandas as gpd
from rasterio.crs import CRS
import multiprocessing as mp
import matplotlib.pyplot as plt
from scipy.spatial import distance as dist
from skimage.segmentation import watershed
import os
from tabulate import tabulate
from fieldCrop import crop
def fieldMask(mosaic, Red=1, Green=2, Blue=3, RedEdge=None, NIR=None, mask=None, index="HUE",
myIndex=None, cropValue=0, cropAbove=True, projection=True, DSMmosaic=None,
DSMcropAbove=True, DSMcropValue=0, plot=True):
Out = []
num_band = mosaic.shape[0]
print(num_band, " layer available", sep="")
if mask == None:
if num_band < 3:
sys.exit(
"At least 3 bands (RGB) are necessary to calculate indices available in FIELDimageR")
if RedEdge == None:
if num_band < 4:
sys.exit("RedEdge and/or NIR is/are not available in your mosaic")
B = mosaic[Red]
G = mosaic[Green]
R = mosaic[Blue]
if RedEdge != None:
RE = mosaic[3]
if NIR != None:
NIR1 = mosaic[3]
if myIndex == None:
print("Mask equation myIndex = ", myIndex, sep="")
Blue = B
Green = G
Red = R
if NIR != None:
NIR = NIR1
if RedEdge != None:
RedEdge = RE
mr = np.arctan(2*(B-G-R)/30.5*(G-R))
if mask != None:
mask = []
if len(mask[0]) > 1:
sys.exit("Mask must have only one band.")
mr = mask
mosaic = crop(mosaic)
if projection:
mosaic = rasterio.warp.reproject(mosaic, mr, method="ngb")
if cropAbove:
m = mr > cropValue
if cropAbove != None:
m = mr < cropValue
Out.append(mosaic)
Out.append(m)
if DSMmosaic != None:
DSMmosaic = crop(DSMmosaic)
if DSMcropAbove:
mDEM = m > DSMcropValue
if DSMcropAbove != None:
mDEM = m < DSMcropValue
if projection:
DSMmosaic = rasterio.warp.reproject(DSMmosaic, mDEM, method='ngb')
DSMmosaic = mask(DSMmosaic, mDEM, maskvalue=True)
Out = dict(newMosaic=mosaic, mask=m, DSM=DSMmosaic)
return Out