【问题标题】:How to quickly and efficiently check if an image is mostly background?如何快速有效地检查图像是否主要是背景?
【发布时间】:2020-02-28 06:47:37
【问题描述】:

我有十亿像素大小的癌症组织的完整幻灯片图像,我正在从中抽取补丁以训练 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))

我生成的许多补丁仍然是空白的,我相信这可能是因为图像的灰白色部分没有被过滤掉。无论如何,我不相信我将补丁转换为灰度然后阈值化以计算白色像素的方法是那么有效。我曾想过可能按文件大小进行比较,因为我注意到所有空白图像的文件大小都很低,但保存补丁,计算文件大小,然后删除它似乎也不是那么有效。关于快速有效地过滤掉非组织斑块的方法有什么想法吗?

编辑:只是我在 cmets 中发布的一些附加信息。 任何不是粉红色或紫色的都是背景。我的补丁是 256x256 的图像,可以超过 1,000,000x1,000,000。我通过在下采样的宽度和高度内随机生成代表补丁左上角的坐标点来选择补丁,检查补丁是否主要是组织,然后将坐标保存到数组中。我的轮廓指出了感兴趣的区域,但我在其中选择补丁的代码工作正常。我只需要选择 ROI 之外的区域,这些区域具有正常组织并且大部分不是空白区域

【问题讨论】:

  • 补丁有多大?如何选择补丁?如果我假设您裁剪出补丁,那么您可以根据某个阈值测试标准偏差值。如果太低,图像是单调的颜色并扔掉。如果它足够高,那么您就有纹理变化和可能的图像内容。
  • 你如何定义“背景”?该定义是否适用于所有 yozr 图片?
  • 任何不是粉红色或紫色的都是背景。我的补丁是 256x256 的图像,可以超过 1,000,000x1,000,000。我通过在下采样的宽度和高度内随机生成代表补丁左上角的坐标点来选择补丁,检查补丁是否主要是组织,然后将坐标保存到数组中。我的轮廓指出了感兴趣的区域,但我在其中选择补丁的代码工作正常。我只需要选择 ROI 之外的区域,这些区域具有正常组织并且大部分不是空白区域。
  • 尝试使用 OpenCV 的 meanStdDev() 并检查标准偏差是否低 - 这意味着您正在查看的 256x256 区域没有太大变化,因此它是平坦且没有变化的。
  • 我试过这个,但不幸的是现在我只拾取边缘的黑线。我无法保证这些线条在图像中的距离以及实际组织在图像中的位置,所以我不能只剪掉图像的边缘。

标签: python image opencv machine-learning image-processing


【解决方案1】:

一种方法是达到 Otsu 的阈值,因此值要么是白色的 255,要么是黑色的 0,然后应用 cv2.countNonZero()。该函数将计算所有非白色像素,如果该值小于预定阈值(图像区域的一半),则它主要是空白背景。这是阈值图像

我们计算白色和黑色像素的像素比率,然后使用这个比率来确定使用最小背景阈值的结果

Pixel ratio: 9.88%
Mostly Background

代码

import cv2

image = cv2.imread('1.png')
h, w, _ = image.shape
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY_INV)[1]

pixels = cv2.countNonZero(thresh)
ratio = (pixels/(h * w)) * 100
print('Pixel ratio: {:.2f}%'.format(ratio))

if ratio < 50:
    print('Mostly Background')
else:
    print('Not Mostly Background')

cv2.imshow('thresh', thresh)
cv2.waitKey()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多