Hello…
I am an engineering student working on a project based on NDVI calculation to monitor the crop health. I used the PiNoIR camera with blue filter for my experiment in order to obtain the values of NIR and Red region. I used the following code to extract the required values and to calculate the NDVI. But in the output image, the empty regions (area where no leaves are present as shown in the below figure) and ground have higher NDVI values. The shadowed regions are shown in the range 0.5 to 0.6. I wanted to know whether the output is correct and what corrections can be done in the -code in order to correct the error. The code is given below.
from PIL import Image
import numpy as np
import cv2
from cv2 import imread
from matplotlib import cm
rgb_matrix =cv2.imread(‘inputimg.jpg’)
w=rgb_matrix.shape[1] #columns
h=rgb_matrix.shape[0] #rows
print(w)
print(h)
#Compute ndvi values for each pixel
#NDVI=(NIR-R)/(NIR+R)
res=[]
for i in range(h):
row=[]
for j in range(w):
val=rgb_matrix[i][j]
n=val[2]
r=val[1]
num=((int(n)-int(r)))
den=((int(n)+int(r)))
if(den == 0):
r=0.0
else:
r=np.divide(num,den)
row.append(r)
res.append(row)
print(‘Done’)
#based on NDVI values, give different colors for easier identification
for i in range(h):
for j in range(w):
if(res[i][j] >=-1 and res[i][j] <0):
rgb_matrix[i][j]=[128,128,128] #grey
elif(res[i][j]>=0 and res[i][j]<0.2):
rgb_matrix[i][j]=[64,255,0] #parrot green
elif(res[i][j]>=0.2 and res[i][j]<0.3):
rgb_matrix[i][j]=[125,255,255] #yellow
elif(res[i][j]>=0.3 and res[i][j]<0.4):
rgb_matrix[i][j]=[0,128,128] #dark green
elif(res[i][j]>=0.4 and res[i][j]<0.5):
rgb_matrix[i][j]=[255,255,0] #sky blue
elif(res[i][j]>=0.5 and res[i][j]<0.6):
rgb_matrix[i][j]=[255,51,153] #purple
elif(res[i][j]>=0.6 and res[i][j]<0.7):
rgb_matrix[i][j]=[0,128,255] #orange
elif(res[i][j]>=0.7 and res[i][j]<0.8):
rgb_matrix[i][j]=[255,43,255] #pink
elif(res[i][j]>=0.8 and res[i][j]<0.9):
rgb_matrix[i][j]=[40,40,255] #red
else:
rgb_matrix[i][j]=[255,0,0] #dark blue
cv2.imwrite(‘outputimg.jpg’,rgb_matrix)
print(“Completed!!”)
(Ignore the indentation errors)
the code you put in does not seem to be the Custom Script supported by Sentinel Hub so I assume you were executing this in some other environment?
It’s difficult to assess, whether the output is correct or not as there are no input data provided.
As a side note, are you aware about the Sentinel Hub Custom Scripts contest? You have time until end of January to submit the script and win the prize. There is even a special one for student groups.
https://www.sentinel-hub.com/contest
-
Does the blue filter skew the Red and NIR channels in a way that makes the math not work as you expected?
-
Maybe there is some channel normalization that needs to be done to correct for sensitivity differences between the channels for the NDVI calculation? For example, the NIR channel value needs to be multiplied by 1.5 first? Or there is a background value for one or both channels that need to be subtracted?
It’s difficult to assess, whether the output is correct or not as there are no input data provided.
I can see that you have used the cv2.imread() function to read an image in Python and then get the rows and columns using shape property.