获取像素级蒙版和 WSI 补丁之间的区域
Get area between pixel wise masks and WSI patches
所以基本上我有一个 WSI(整张幻灯片图像),看起来像这样:
我有一个 png 面具,看起来像这样:
及其在 WSI 上的位置(x:1098,y:2116,宽度:167,高度:378)
现在我要做的是获取 WSI,从 WSI 中创建尺寸为 96x96 的补丁,对于这些补丁中的每一个,我想检查掩码文件下的白色区域是否至少存在于 2 /3 创建的补丁。
例如,这是我创建补丁的伪代码:
self.crop_size = 96
is_fit = False
while True:
patch_x = 0
while True:
patches.append((patch_x, patch_y, self.crop_size, self.crop_size, is_fit))
if patch_x + self.crop_size > width:
patch_x = width - self.crop_size
patches.append((patch_x, patch_y, self.crop_size, self.crop_size, is_fit))
break
else:
patch_x += self.crop_size
if patch_y + self.crop_size > height:
patch_y = height - self.crop_size
patches.append((patch_x, patch_y, self.crop_size, self.crop_size, is_fit))
break
else:
patch_y += self.crop_size
现在对于每个补丁(我认为一个补丁是我在 patches.append()
中插入的元组)我希望能够将 True
设置为 is_fit
如果至少有 2/3面罩的白色区域存在于贴片中。
请注意,在这里我有权从代码中打开掩码文件,但不能从 WSI 中打开,因为它会占用太多内存。
有任何想法吗?
谢谢。
您可以应用以下算法:
对于 WSI 中的每个补丁 (x, y, width, height)
,计算其相对于遮罩位置的坐标:(x2, y2, width2, height2)
。 min
和 max
可以做一些计算,但没有什么不可能的。
对于每个补丁,计算比率 cv2.countNonZero(mask[y2:y2+height2, x2:x2 + width2]) / (self.crop_size * self.crop_size)
。如果这个比例高于 2/3,那么您可以将补丁设置为 isFit = True
.
为了得到面片在掩码中的位置,我们假设掩码是一个在 WSI 中坐标为 (x_m, y_m, width_m, height_m)
的矩形。
那么一个补丁 (x, y, width, height)
将在掩码中具有以下坐标:
x2 = max(x - x_m, 0)
这个值可以高于 width_m
在这种情况下你可以忽略补丁,因为它完全在掩码之外。
y2 = max(y - y_m, 0)
这个值可以高于 height_m
在这种情况下你可以忽略补丁,因为它完全在掩码之外。
width2 = min(self.crop_size, width_m - x2)
height2 = min(self.crop_size, height_m - y2)
所以基本上我有一个 WSI(整张幻灯片图像),看起来像这样:
我有一个 png 面具,看起来像这样:
及其在 WSI 上的位置(x:1098,y:2116,宽度:167,高度:378)
现在我要做的是获取 WSI,从 WSI 中创建尺寸为 96x96 的补丁,对于这些补丁中的每一个,我想检查掩码文件下的白色区域是否至少存在于 2 /3 创建的补丁。 例如,这是我创建补丁的伪代码:
self.crop_size = 96
is_fit = False
while True:
patch_x = 0
while True:
patches.append((patch_x, patch_y, self.crop_size, self.crop_size, is_fit))
if patch_x + self.crop_size > width:
patch_x = width - self.crop_size
patches.append((patch_x, patch_y, self.crop_size, self.crop_size, is_fit))
break
else:
patch_x += self.crop_size
if patch_y + self.crop_size > height:
patch_y = height - self.crop_size
patches.append((patch_x, patch_y, self.crop_size, self.crop_size, is_fit))
break
else:
patch_y += self.crop_size
现在对于每个补丁(我认为一个补丁是我在 patches.append()
中插入的元组)我希望能够将 True
设置为 is_fit
如果至少有 2/3面罩的白色区域存在于贴片中。
请注意,在这里我有权从代码中打开掩码文件,但不能从 WSI 中打开,因为它会占用太多内存。
有任何想法吗?
谢谢。
您可以应用以下算法:
对于 WSI 中的每个补丁
(x, y, width, height)
,计算其相对于遮罩位置的坐标:(x2, y2, width2, height2)
。min
和max
可以做一些计算,但没有什么不可能的。对于每个补丁,计算比率
cv2.countNonZero(mask[y2:y2+height2, x2:x2 + width2]) / (self.crop_size * self.crop_size)
。如果这个比例高于 2/3,那么您可以将补丁设置为isFit = True
.
为了得到面片在掩码中的位置,我们假设掩码是一个在 WSI 中坐标为 (x_m, y_m, width_m, height_m)
的矩形。
那么一个补丁 (x, y, width, height)
将在掩码中具有以下坐标:
x2 = max(x - x_m, 0)
这个值可以高于width_m
在这种情况下你可以忽略补丁,因为它完全在掩码之外。y2 = max(y - y_m, 0)
这个值可以高于height_m
在这种情况下你可以忽略补丁,因为它完全在掩码之外。width2 = min(self.crop_size, width_m - x2)
height2 = min(self.crop_size, height_m - y2)