我在使用python的xarray数据时遇到了OpenCV中的形态学函数的问题。
我已经生成了一个二进制xarray数据数组的列表(我知道我可能应该使这些数据数组成为数据集的另一个维度,但我还没有做到这一点)。
我正在尝试对这些数据进行形态学闭包。在下面的代码片段中,我从datarray中提取实际数据作为numpy数组,然后尝试对该数组进行闭包。我对OpenCV的理解是,当它读入一个图像时,它实际上会将其转换为numpy数组,所以我认为这可能会起作用。我应该提到,数据最初是一个geotiff,我正在用rioxarray来阅读它,如果这有什么不同的话。
本质上,似乎正在发生的事情是,数据正在被每次迭代的内核大小所移位,我已经通过在运行关闭操作之前和之后阅读数组中相同的数据切片来确认这一点,它还抛出了“Axis Limits不能是NaN或Inf”的错误,输出的numpy数组与原来的大小相同,但它的一部分在一个角落被切掉了,和另一个角,显示已添加无数据值(?)(值为-1.798e+308)。
我不知道为什么会这样。当我在imread中读取一个图像时,从我所知道的来看,同样的过程似乎工作得很好。我也不知道关闭操作是否在做它应该做的事情。乍一看,它只是看起来像是在移动它。代码和图像如下。
import rioxarray as rxr
import xarray as xr
import cv2 as cv
import numpy as np
kSize = 15 #Kernel size
iters = 2 #number of iterations
#Binary list is a list of several binary images generated using xarray.where function
binaryCopy = binaryList[0].copy() #Copy one datarray from list of datarrays...prob should just put this all into one xr dataset, but oh well
inAttrs = binaryCopy.attrs.copy() #Copy attributes to read back in at the end
inDims = binaryCopy.dims
inCoords = binaryCopy.coords
kern = cv.getStructuringElement(cv.MORPH_RECT,(kSize,kSize)) #Create square kernel
print(binaryCopy.data.shape) #Print shape of data array (appears to just be a numpy array)
#I had tried this v first, but it did not work, so I tried the steps individually...same issue
#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)
#Plot the original first
binaryList[0].plot(ax=ax[0])
#Plot the closed data
newBinaryArray.plot(ax=ax[1])
plt.rcParams['figure.figsize'] = (15,8)
1条答案
按热度按时间sd2nnvve1#
好的,看起来我的问题是锚。如果你设置参数anchor=(0,0),这似乎可以防止数据的移动。(我认为这应该是(-1,-1),因为互联网上的其他地方似乎表明,把锚放在中间,但(0,0)似乎更适合我。
此外,当我添加borderType=cv.BORDER_REPLICATE(见此处)作为morphologEx函数的参数时(我只是使用该参数,而不是使用膨胀和腐 eclipse ),这防止了在数据被移动时插入的额外条带成为一个巨大的“无数据”值,并使用了边界处的数据值。