我有巨大的千兆像素大小的癌症组织全切片图像,我正在从中采样补丁以训练卷积神经网络(CNN)。以下是其中一个补丁的外观:
目前,我正在使用下面的代码来尝试滤除超过30%空白的背景补丁,但似乎不起作用。
i = random.randint(0, x - patch_size/(2**level))
j = random.randint(0, y - patch_size/(2**level))
grey = cv2.cvtColor(img[j:j+patch_size/(2**level), i:i+patch_size/(2**level)], cv2.COLOR_RGB2GRAY)
ret, thresh = cv2.threshold(grey, 80, 255, cv2.THRESH_BINARY)
if numpy.sum(thresh <= 10) >= 0.3*(patch_size**2):
arr.append((i, j))
我正在生成的许多补丁仍然是空白的,我认为这可能是因为图像的灰白色部分没有被过滤掉。无论如何,我不认为我的方法将补丁转换为灰度图像,然后阈值处理以计算白色像素的数量是非常有效的。我想到了通过文件大小进行比较,因为我注意到所有空白图像都具有较低的文件大小,但保存一个补丁,计算文件大小,然后删除它似乎也不是非常有效的。对于快速和高效地过滤掉非组织补丁,您有什么想法吗?
编辑:我在评论中发布了一些附加信息。 除了粉色或紫色之外的任何内容都是背景。我的补丁是256x256的图像,可以超过1,000,000x1,000,000。我通过随机生成代表下采样宽度和高度内一个补丁左上角的坐标点来选择补丁,检查补丁是否主要由组织构成,然后将坐标保存到数组中。我有指出感兴趣区域的轮廓,但我选择其中的补丁的代码很好用。我只需要选择ROIs之外的正常组织区域,而不是大部分为空白空间的区域。
meanStdDev()
函数,并检查标准差是否较低 - 这意味着您正在查看的256x256区域中没有太多变化,因此它是平坦且没有变化的。 - Mark Setchellnp.nonzero
找到非零像素,然后使用它来确定背景是否为空。 - coffeewin