如何检查RGB三个二维数组对应元素是否全零,规避GLI计算NaN值
解决GLI计算中NaN值的问题
你的核心问题是未利用分割得到的背景掩码过滤无效像素,导致全零的背景像素参与计算产生NaN。直接用生成的二值掩码筛选有效像素即可跳过这些元素,具体修改如下:
关键修改步骤
- 将分割得到的二值掩码转换为布尔索引,标记有效绿色区域
- 仅提取有效区域的RGB通道值进行GLI计算,从根源避免全零像素
修改后的完整代码
# Import libraries import numpy as np from plantcv import plantcv as pcv import cv2 import matplotlib.pyplot as plt import os import glob from skimage import io, img_as_float, img_as_float32, img_as_ubyte, img_as_float64 folder = r"D:\Data\Koochia_Summer_trial\Output\Segmented green 7 days images\Barns 2021_treated" gli_list = [] for file in glob.glob(folder + "\*.*"): img = cv2.imread(file) a = pcv.rgb2gray_lab(rgb_img=img, channel='a') ret, thresh1 = cv2.threshold(a, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) img_arr = img_as_float32(img) r = img_arr[:,:,2] b = img_arr[:, :, 0] g = img_arr[:,:,1] # 利用分割掩码筛选有效像素(背景为0,有效区域为255,转成布尔型索引) valid_mask = thresh1 > 0 # 提取有效区域的RGB值 r_valid = r[valid_mask] g_valid = g[valid_mask] b_valid = b[valid_mask] # 仅对有效像素计算GLI,无需处理NaN gli_valid = (2 * g_valid - r_valid - b_valid) / (2 * g_valid + r_valid + b_valid) # 计算平均GLI average_gli = gli_valid.mean() # 若需保留原图像尺寸的GLI矩阵(用于可视化等场景),可添加以下代码: # gli = np.full_like(g, np.nan) # gli[valid_mask] = gli_valid gli_list.append(average_gli)
说明
- 因为已经通过
valid_mask过滤掉背景像素,有效区域的RGB值不会全为零,GLI计算自然不会产生NaN,无需再使用np.nan_to_num或忽略无效值的设置 - 原代码中
gr、bl、re以及gxi的计算,也可采用同样逻辑,仅针对有效像素进行运算
内容的提问来源于stack exchange,提问作者Kamal Gill
相关产品推荐
相关产品推荐

