NDVI值计算和图像处理

时间:2020-01-14 06:11:29

标签: python opencv crop

we have attached our input and processed image[![][1]][1]我是一名工程专业的学生,​​致力于基于NDVI计算的项目来监控作物健康。为了获得NIR和Red Region的值,我在实验中使用了带蓝色滤镜的PiNoIR相机。我使用以下代码提取所需的值并计算NDVI。但是在输出图像中,空白区域(如下图所示没有叶子的区域)和地面的NDVI值较高。阴影区域显示在0.50.6的范围内。我想知道输出是否正确,以及可以在-code中进行哪些更正以更正错误。代码如下。

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 induntation errors)

1 个答案:

答案 0 :(得分:1)

几件事...首先,请注意,OpenCV使用BGR排序,而不是您的代码似乎假定的RGB。这可能意味着您选择了错误的通道,例如Red和NearIR-如果这样,我的代码将具有相同的错误。

其次,您确实非常想尝试避免在Python中使用for循环进行图像处理-它们非常慢,难以阅读并且容易出现循环限制错误。以下是未经测试的代码,因为您没有提供图像,但是应该可以使您有所了解:

import numpy as np
import cv2

# Load image and convert to float - for later division
im = cv2.imread('inputimg.jpg').astype(np.float)

# Split into 3 channels, discarding the first and saving the second as R, third as NearIR
_, R, NearIR = cv2.split(im)

# Compute NDVI values for each pixel
NDVI = (NearIR - R) / (NearIR + R + 0.001)

这使我们可以在代码中打印Done的地方。请注意,如果您不知道OpenCV使用BGR排序,则第1个和第3个通道将需要交换,即:

NearIR, R, _ = cv2.split(im)

接下来的部分是分配一种颜色,我将让您思考-请记住,您的NDVI将是[-1,1]范围内的浮点,因此您可能需要将其乘以10并转换为整数以分配9种颜色之一...

请上传图片,以便人们更好地回答您。