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

使用OpenCV处理Xarray数据数组时形态学操作引发图像偏移问题

使用OpenCV形态学函数处理Xarray数据时的偏移与无数据值问题

问题概述

  • 数据来源:通过rioxarray读取GeoTIFF生成的二进制Xarray DataArray列表(暂未整合为数据集的单个维度)
  • 处理逻辑:将DataArray提取为NumPy数组后执行形态学闭运算(因OpenCV处理图像本质也是操作NumPy数组,故采用此方法)
  • 异常现象:
    • 数据每次迭代会按内核大小偏移,对比处理前后相同切片已确认该问题
    • 运行时抛出Axis Limits cannot be NaN or Inf(轴限制不能为NaN或无穷大)错误
    • 输出数组尺寸与原数组一致,但一角数据被截断,另一角出现无数据值(-1.798e+308)
    • 用cv.imread读取图像时相同流程可正常运行,目前仅能观察到偏移问题,无法确认闭运算是否生效

代码示例

import rioxarray as rxr
import xarray as xr
import cv2 as cv
import numpy as np

kSize = 15 # 内核大小
iters = 2 # 迭代次数

# binaryList是用xarray.where生成的多个二值图像DataArray列表
binaryCopy = binaryList[0].copy() # 从列表中复制一个DataArray(后续应整合到单个xr数据集中)
inAttrs = binaryCopy.attrs.copy() # 复制属性用于后续还原
inDims = binaryCopy.dims
inCoords = binaryCopy.coords

kern = cv.getStructuringElement(cv.MORPH_RECT,(kSize,kSize)) # 创建方形内核

print(binaryCopy.data.shape) # 打印数据数组的形状(本质是NumPy数组)

# 最初尝试直接用morphologyEx,结果不行,拆分步骤后问题依旧
# closed = cv.morphologyEx(binaryCopy.data, cv.MORPH_CLOSE, kern)

dilated = cv.dilate(binaryCopy.data, kern, iters)
closed = cv.erode(dilated, kern, iters)

newBinaryArray= xr.DataArray(closed,
                        coords=inCoords, 
                        dims=inDims,
                        attrs=inAttrs)

fig, ax = plt.subplots(nrows=1, ncols=2, sharey=True)

# 绘制原始数据
binaryList[0].plot(ax=ax[0])                           
# 绘制闭运算处理后的数据
newBinaryArray.plot(ax=ax[1])
plt.rcParams['figure.figsize'] = (15,8)

现象对比

处理前(左)和处理后(右)的形态学闭运算结果:右侧图像底部和左侧出现蓝色条带,对应无数据值(-1.798e+308)。

内容的提问来源于stack exchange,提问作者blerbthe3rd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 14:10:30