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

时间:2017-02-02 17:29:54

标签: python arrays image numpy scipy

我正在使用尺寸为90112 x 100352的tiff幻灯片。幻灯片大小为1.3GB。为了处理这张幻灯片,我正在创建一个numpy memmap文件,其上面的尺寸如下所示。

如果我检查“test.memmap”的大小,它显示近27GB。我不知道为什么它比原来的tiff文件大得多。

我正在通过补丁阅读原始幻灯片补丁并使用“memMapRef”复制其RGB值。在阅读完整张幻灯片后,我在“memMapRef”上的某些X,Y坐标处绘制了一个矩形。绘制矩形后,现在我尝试使用“memMapRef”numpy数组中的代码创建图像。在这里,我得到错误“大小不适合int”。

我正在使用scipy.misc中的“imsave”方法。

我的完整代码如下:

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])

我错误的地方以及如何修复它?

0 个答案:

没有答案