我是python编程新手,如果我的问题太基本了,请原谅我。以前这个论坛帮了我很多忙,谢谢你们的贡献。在
这次我有一组12000个图像数据,我正在对它们执行奇异值分解(svd)并计算它们的平均值。有些图像有非常高的正或负值像素,我不想在计算过程中使用这些像素,所以我使用
numpy.ma.masked_array
将它们从svd和均值计算中排除。有些图像比其他图像更小,它们被填充了零值,以使所有图像具有相同的(像素)维度。但我也不希望在计算过程中使用“零填充”,所以我使用numpy.ma.masked_array
将它们从svd和均值计算中排除。在
以下是一些示例图像:
问题是,当我同时执行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)
我得到的最终结果-eigenimage
和meanimage
-并没有从计算中排除屏蔽值。我不知道我做错了什么。拜托,我需要一些能帮我解决这个问题的想法。在
上面是一些我正在处理的图像(光束)数据的示例。在
在计算特征图像和平均图像后,我得到的最终图像是:
本征(波束)图像(带奇异值分解)
平均(波束)图像(掩蔽阵列平均值)
从上面的图中可以看出,本征图像和平均图像都丢失了许多不需要的旁瓣信息。在
但我希望最后的特征图像
{mean>实际从填充的像素中排除('mean})。我通过将这个结果与不加遮罩的计算结果进行比较来证实这一点,并注意到一个显著的差异,这证实了{}平均值对我的情况是完美的。在
在SVD特征图像上: 问题在于
v
(np.transpose(v)
)的转置。我从文档(1)中发现,numpy.linalg.svd
返回一个v
的转置,所以我只需要在不转置v
的情况下执行点积。在bimage = np.dot(np.dot(u[:,:2],np.diag(s[:2])),v[:2,:])
相关问题 更多 >
编程相关推荐