为什么内存映射文件比原始文件大

2024-09-30 18:33:35 发布

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

我有一张尺寸为90112 x 100352的tiff幻灯片。幻灯片大小为1.3GB。为了处理这张幻灯片,我创建了一个numpymemmap文件,上面的维度如下。你知道吗

如果我检查一下测试.memmap,显示了将近27GB的容量。我不知道为什么它比原来的tiff文件大这么多。你知道吗

我正在逐块阅读原始幻灯片,并用“memMapRef”复制其RGB值。看完整张幻灯片后,我在“memMapRef”的某个X,Y坐标上画了一个矩形。在绘制完矩形之后,现在我尝试使用下面的“memMapRef”numpy数组代码创建图像。这里我得到的错误是“大小不适合整数”。你知道吗

我使用的是来自的“imsave”方法scipy.misc公司. 你知道吗

我的全部代码如下:

import cv2
import numpy as np
from scipy.misc import imread, imresize, imsave
import openslide
level = 0
read_size = (10000, 10000) # reading size per patch
tumor_file = "Test_Tumor.tif" # 1.3 GB file 
tumor_slide = openslide.open_slide(tumor_file)
max_OX,max_OY = tumor_slide.level_dimensions[level] # max_OX = 90112 max_OY = 100352
memMapRef = np.memmap('test.memmap', dtype='uint8', mode='w+', shape=(max_OY,max_OX,3))
def process_slide():
    for start_OX in xrange(0,max_OX,read_size[0]):
        for start_OY in xrange(0,max_OY,read_size[1]):
            size_OX=min(read_size[0],max_OX-start_OX)
            size_OY=min(read_size[1],max_OY-start_OY)
            tile = np.array(tumor_slide.read_region((start_OX,start_OY),level,(size_OX,size_OY)), dtype="uint8")[:,:,:3]
            yield tile, start_OX, start_OY

for img_tile, X, Y in process_slide():
    h,w,d = img_tile.shape
    memMapRef[Y: Y+h, X: X+w] = img_tile

x1 = 500
y1 = 1000
x2 = x1+256
y2 = y1+256
cv2.rectangle(memMapRef,(x1,y1),(x2,y2),(0,255,0),10)
cv2.imwrite("output.png", cv2.cvtColor(memMapRef, cv2.COLOR_RGB2BGR), [cv2.IMWRITE_PNG_COMPRESSION, 9])

我哪里做错了,怎么改正?你知道吗


Tags: importreadsizelevelcv2startmaxox