我是一名工程专业的学生,致力于基于NDVI计算的项目来监控作物健康。为了获得NIR和Red Region的值,我在实验中使用了带蓝色滤镜的PiNoIR相机。我使用以下代码提取所需的值并计算NDVI。但是在输出图像中,空白区域(如下图所示没有叶子的区域)和地面的NDVI值较高。阴影区域显示在0.5
到0.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)
最佳答案
首先,请注意,OpenCV使用BGR排序,而不是您的代码似乎采用的RGB。这可能意味着您选择了错误的通道,例如Red和NearIR-如果这样,我的代码将具有相同的错误。
其次,您确实非常想尝试避免使用for
循环在Python中进行图像处理-它们非常慢,难以阅读并且容易出现循环限制错误。以下是未经测试的代码,因为您没有提供图像,但是应该可以使您有所了解:
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种颜色中的一种...
请上传图片,以便其他人可以更好地回答您。
关于python - NDVI值计算和图像处理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59728357/