奇异值分解(svd)和均值在计算过程中不排除屏蔽值

2024-09-14 23:04:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我是python编程新手,如果我的问题太基本了,请原谅我。以前这个论坛帮了我很多忙,谢谢你们的贡献。在

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

以下是一些示例图像:

example beam images

问题是,当我同时执行svd和mean计算时,在计算过程中没有排除屏蔽值(数组元素)。我已经尽我所能解决这个问题,但没有成功。下面是我采取的步骤。在

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-并没有从计算中排除屏蔽值。我不知道我做错了什么。拜托,我需要一些能帮我解决这个问题的想法。在

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

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

本征(波束)图像(带奇异值分解)

Eigen-image (beam)

平均(波束)图像(掩蔽阵列平均值)

Mean image (beam)

从上面的图中可以看出,本征图像和平均图像都丢失了许多不需要的旁瓣信息。在

但我希望最后的特征图像

Expected eigen image (beam)


Tags: the图像imagenumpyfornpmask像素
1条回答
网友
1楼 · 发布于 2024-09-14 23:04:49

{mean>实际从填充的像素中排除('mean})。我通过将这个结果与不加遮罩的计算结果进行比较来证实这一点,并注意到一个显著的差异,这证实了{}平均值对我的情况是完美的。在

在SVD特征图像上: 问题在于vnp.transpose(v))的转置。我从文档(1)中发现,numpy.linalg.svd返回一个v的转置,所以我只需要在不转置v的情况下执行点积。在

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

相关问题 更多 >