gpt4 book ai didi

python - 奇异值分解 (svd) 和均值在计算期间不排除屏蔽值

转载 作者:太空宇宙 更新时间:2023-11-03 17:31:31 25 4
gpt4 key购买 nike

我是Python编程新手,所以如果我的问题太基础,请原谅我。我之前从这个论坛得到了很多帮助,感谢你们的所有贡献。

这次我有一组 12,000 个图像数据,我正在对其执行奇异值分解 (svd) 并计算它们的平均值。有些图像的像素具有非常高的正值或负值,我不想在计算过程中使用这些像素,所以我使用numpy.ma.masked_array 将它们从 svd 和均值计算中排除。有些图像比其他图像小,并且用零值填充,以使所有图像具有相同的(像素)尺寸。但我也不希望在计算过程中使用“零填充”,因此我使用 numpy.ma.masked_array 将它们从 svd 和均值计算中排除。

以下是一些示例图像:

example beam images

问题是,当我执行 svd 和均值计算时,在计算过程中不会排除屏蔽值(数组元素)。我已经尝试了我所知道的一切来解决这个问题,但没有成功。以下是我采取的步骤。

from numpy.linalg import svd
import numpy as np
from numpy.ma import masked_array


n, x, y = images.data.shape
Z = []
meanimage = []

for icount in range(n):
image = images[icount,:,:] # current image

# creating a mask for too positively or negatively high values
mask = (np.abs(image) > 2).astype(int);
yindex = 0; xindex = 0;

# --- creating a mask for zero padded values
for i in range(y/2): # get the index of the first none zero pixel
if image[i,x/2] != 0:
yindex = i
break
for i in range(x/2): # get the index of the first none zero pixel
if image[y/2,i] != 0:
xindex = i
break
mask[:yindex,:] = 1;mask[-yindex:,:] = 1;
mask[:xindex,:] = 1;mask[-xindex:,:] = 1;
# ---

image = masked_array(images[icount,:,:], mask)

Z.append(image.ravel()) # accummulating matrix for svd computation
meanimage.append(image) # accummulating matrix for for mean computation

# calc. SVD
u,s,v = svd(masked_array(Z))

#calc. mean image
meanimage = masked_array(meanimage).mean(axis=0)

bimage = np.dot(np.dot(u[:,:2],np.diag(s[:2])),np.transpose(v)[:2,:])

eigenimage = bimage[2,:].reshape(x, y)

我得到的最终结果 - eigenimagemeanimage - 不会从计算中排除屏蔽值。我不知道我做错了什么。拜托,我需要一些想法来帮助我解决这个问题。

上面是我正在使用的图像(光束)数据的一些示例。

计算特征图像和平均图像后得到的最终图像是:

特征(光束)图像(带有 SVD)

Eigen-image (beam)

平均(光束)图像(masked_array 平均值)

Mean image (beam)

从上图可以看出,特征像和平均像都丢失了很多不需要的旁瓣信息。

但我期望最终的特征图像是这样的

Expected eigen image (beam)

最佳答案

masked_array 均值实际上从均值计算中排除了屏蔽像素(“零填充”)。我通过将此结果与没有掩码计算的结果进行比较来确认这一点,并发现了显着的差异,这证实了 numpy.ma.masked_array 均值非常适合我的情况。

在 SVD 特征图像上:问题出在转置 v (np.transpose(v)) 上。我从文档( 1 )中发现 numpy.linalg.svd 返回 v 的转置,因此我只需要执行点积而不转置 v.

bimage = np.dot(np.dot(u[:,:2],np.diag(s[:2])),v[:2,:])

关于python - 奇异值分解 (svd) 和均值在计算期间不排除屏蔽值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31773078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com