我有一个mat文件,其中包含大约7000张以扁平格式存储的512 x512维图像的稀疏数据(行为262144),我使用scipy的loadmat方法将此稀疏信息转换为压缩稀疏列格式。这些图像中的数据是较小的图像,通常在512 x512区域内的某个位置,大约为25 x25像素,虽然小图像的实际大小不是恒定的,并且每个图像的大小都在变化,但是我想从这种格式中获得稀疏信息,并将其转换为一个只有小图像中数据的numpy数组;所以如果我有一个512 x512的图像,但是在20 x20的区域中间有一个圆,我只想得到20 x20的区域和圆,而不想得到512 x512图像的其他部分,我知道我可以使用.A把图像转换成非稀疏格式,得到一个512 x512的numpy数组,但是这个选项对我的RAM来说不太理想。
有没有一种方法可以提取以稀疏格式存储的较小图像,而无需将稀疏数据转换为密集数据?
我试着把稀疏的数据变成密集的数据,把它重新塑造成一个512 x512的图像,然后我写了一个程序,通过检查从上,下,左,右开始出现的数据来找到图像的上,下,左,右边缘,但是整个过程看起来效率非常低。
1条答案
按热度按时间x8diyxa71#
抱歉我提供的信息太少;我最终找到了答案。Scipy的loadmat函数在用于从mat文件中提取稀疏数据时返回一个csc_matrix,然后我将其转换为numpy的压缩稀疏列格式。Numpy的格式有一个方法
.nonzero()
,它将返回该矩阵中每个非零元素的索引。然后我将numpy的csc矩阵重新整形为512 x512。然后使用.nonzero()
获得2D中的非零元素,然后使用这些索引计算出我感兴趣的图像的最大高度和宽度。然后我创建了一个我想要的图像大小的零的numpy矩阵,并通过索引到我的numpy csc矩阵(在我调用.tocsr()
之后),将numpy矩阵中的元素设置为我想要的像素的元素