You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检查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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 21:40:21