python中input数组_python-numpy.interp和掩码数组

这篇博客讨论了在Python中如何使用numpy处理图像,特别是涉及蒙版数组进行高斯拉伸操作。作者遇到的问题是在处理带有NoData边框的图像时,蒙版被忽略。解决方案是利用scipy.stats.norm计算正态分布的累积分布函数(CDF),并应用掩码来只处理未屏蔽的数据。
摘要由CSDN通过智能技术生成

我正在使用一个numpy蒙版数组来执行一些图像处理.设置了遮罩可处理围绕图像的NoData像素(必要边界,因为这些是地图投影图像,其原点位于无数据像素中).

使用以下代码块,我可以对图像执行高斯拉伸.

def gaussian_stretch(input_array, array_mean, array_standard_deviation, number_of_bins, n):

shape = input_array.shape

input_array = input_array.flatten()

#define a gaussian distribution, get binned GDF histogram

array_standard_deviation *= n

gdf = numpy.random.normal(array_mean, array_standard_deviation, 10000)

hist, bins = numpy.histogram(gdf, number_of_bins, normed=True)

cdf = hist.cumsum()

cdf = 256 * cdf / cdf[-1]

#interpolate and reshape

input_array = numpy.interp(input_array,bins[:-1],cdf)

input_array = input_array.reshape(shape)

return input_array

如果图像不包含NoData边框,则拉伸将按预期进行.在带有遮罩的图像上,遮罩将被忽略.这是预期的行为吗?关于如何仅处理未屏蔽数据的任何想法?

我尝试使用input_array.compressed(),但这将返回仅包含未屏蔽值的一维数组.如预期的那样,由于数组之间的大小差异,使用numpy.interp失败.

最后,我了解到使用numpy.random.normal并不总是会返回理想的高斯分布,并且一旦算法的其余部分起作用,我将添加一些误差约束.

解决方法:

您可以先获取input_array的掩码,并将其应用于结果数组,然后使用scipy.stats.norm计算正态分布的cdf,也可以使用scipy.special.erf()通过使用cdf公式计算cdf正态分布:

import scipy.stats as stats

def gaussian_stretch2(input_array, array_mean, array_standard_deviation, n):

mask = input_array.mask

n = stats.norm(array_mean, array_standard_deviation*n)

return numpy.ma.array(n.cdf(input_array), mask=mask)

标签:image-processing,arrays,python,numpy

来源: https://codeday.me/bug/20191208/2088753.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
numpy数组元素周围的操作可以通过以下几种方式实现: 1. 切片操作:可以使用numpy数组的切片操作来获取数组元素的周围元素。 例如,对于一个二维数组arr,要获取第i行第j列元素周围的元素,可以使用如下切片操作: ```python arr[i-1:i+2, j-1:j+2] ``` 这将返回一个3x3的子数组,其心元素为arr[i,j],周围的8个元素为该子数组的其余元素。 2. 使用numpy.pad()函数:numpy.pad()函数可以用来在数组的边缘添加一个或多个值,从而扩展数组的大小。可以使用该函数来添加额外的行和列,然后通过索引访问周围的元素。 例如,对于一个二维数组arr,要获取第i行第j列元素周围的元素,可以使用如下代码: ```python padded_arr = np.pad(arr, ((1, 1), (1, 1)), mode='constant') surrounding = padded_arr[i:i+3, j:j+3] ``` 这将在数组的边缘添加一行和一列,并使用常量值填充这些额外的元素。然后可以使用切片操作来获取心元素周围的元素。 3. 使用numpy.roll()函数:numpy.roll()函数可以用来沿着给定轴滚动数组的元素。可以使用该函数来将数组的行和列进行滚动,从而获取周围的元素。 例如,对于一个二维数组arr,要获取第i行第j列元素周围的元素,可以使用如下代码: ```python rows, cols = arr.shape row_indices = np.arange(i-1, i+2) % rows col_indices = np.arange(j-1, j+2) % cols surrounding = arr[row_indices][:, col_indices] ``` 这将将第i行向上和向下滚动一行,并将第j列向左和向右滚动一列,从而获取心元素周围的元素。使用模运算可以确保在数组的边缘滚动时正确处理索引。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值