带标记的图像函数

带标签的图像是整数图像,其中的值对应于不同的区域。也就是说,区域1是所有有值的像素 1 区域2是值为2的像素,依此类推。按照惯例, region 0 is the background and often handled differently

为图像添加标签

在 0.6.5 版本加入.

第一步是从二元函数中获得标记函数:

import mahotas as mh
import numpy as np
from pylab import imshow, show

regions = np.zeros((8,8), bool)

regions[:3,:3] = 1
regions[6:,6:] = 1
labeled, nr_objects = mh.label(regions)

imshow(labeled, interpolation='nearest')
show()

(Source code, png, hires.png, pdf)

_images/labeled-1.png

这将产生一个具有3个值的图像:

  1. 背景,其中原始图像为0

  2. 第一个区域:(0:3,0:3);

  3. 第二个地区:(6:,6:)。

还有一个额外的论据 label :结构元素,默认为3x3交叉(或4邻域)。这定义了两个像素位于同一区域意味着什么。您可以使用8个邻域,将其替换为一个正方形::

labeled,nr_objects = mh.label(regions, np.ones((3,3), bool))

我们现在可以收集有关已标记区域的一些统计数据。例如,它们有多大?

sizes = mh.labeled.labeled_size(labeled)
print('Background size', sizes[0])
print('Size of first region: {}'.format(sizes[1]))

此大小简单地用每个区域中的像素数来衡量。相反,我们可以测量每个区域的总权重:

array = np.random.random_sample(regions.shape)
sums = mh.labeled_sum(array, labeled)
print('Sum of first region: {}'.format(sums[1]))

滤波区

在 0.9.6 版本加入: remove_regions & relabel 都被添加了。

这里有一个稍微复杂一点的例子。完整的代码在 demos directory AS nuclear.py. We are going to use this image, a fluorescent microscopy image from a nuclear segmentation benchmark

此图像以以下形式提供 mahotas.demos.nuclear_image()

import mahotas as mh
import mahotas.demos
import numpy as np
from pylab import imshow, show

f = mh.demos.nuclear_image()
f = f[:,:,0]
imshow(f)
show()

(Source code, png, hires.png, pdf)

_images/labeled-2.png

首先,我们执行一些高斯滤波和阈值处理:

f = mh.gaussian_filter(f, 4)
f = (f> f.mean())

(如果不使用高斯过滤器,则得到的阈值图像具有非常嘈杂的边缘。您可以在 demos/ 目录,并试用它。)

f = mh.gaussian_filter(f, 4)
f = (f> f.mean())
imshow(f)
show()

(Source code, png, hires.png, pdf)

_images/labeled-3.png

标记得到了我们所有的核::

labeled, n_nucleus  = mh.label(f)
print('Found {} nuclei.'.format(n_nucleus))
labeled, n_nucleus  = mh.label(f)
print('Found {} nuclei.'.format(n_nucleus))
imshow(labeled)
show()

(Source code, png, hires.png, pdf)

_images/labeled-4.png

42 发现了细胞核。没有遗漏,但不幸的是,我们也得到了一些聚合。在这种情况下,我们将假设我们想要对真实的原子核进行一些测量,但愿意过滤掉任何不是完整的原子核或原子核上的肿块。因此,我们测量大小并过滤:

sizes = mh.labeled.labeled_size(labeled)
too_big = np.where(sizes > 10000)
labeled = mh.labeled.remove_regions(labeled, too_big)
sizes = mh.labeled.labeled_size(labeled)
too_big = np.where(sizes > 10000)
labeled = mh.labeled.remove_regions(labeled, too_big)
imshow(labeled)
show()

(Source code, png, hires.png, pdf)

_images/labeled-5.png

我们还可以删除与边界接触的区域::

labeled = mh.labeled.remove_bordering(labeled)
labeled = mh.labeled.remove_bordering(labeled)
imshow(labeled)
show()

(Source code, png, hires.png, pdf)

_images/labeled-6.png

这个数组, labeled 现在具有范围内的值 0n_nucleus ,但缺少某些值(例如,If Region 7 是接触边境的人之一,然后 7 未在标签中使用)。我们可以的 relabel 要获得更干净的版本::

relabeled, n_left = mh.labeled.relabel(labeled)
print('After filtering and relabeling, there are {} nuclei left.'.format(n_left))

现在,我们有 24 原子核和 relabeled0 (背景)至 24

relabeled, n_left = mh.labeled.relabel(labeled)
print('After filtering and relabeling, there are {} nuclei left.'.format(n_left))
imshow(relabeled)
show()

(Source code, png, hires.png, pdf)

_images/labeled-7.png

在Mahotas之后的版本中 1.4 ,我们甚至可以通过单个调用来执行许多相同的操作 mh.labeled.filter_labeled **

relabeled,n_left = mh.labeled.filter_labeled(labeled, remove_bordering=True, max_size=10000)

边框

边界像素是指在其邻近区域中有多个区域的像素(其中一个区域可以是背景)。

方法检索边界像素。 borders() 函数,该函数获取所有边框或 border() (请注意单数),它只获取一对区域之间的边界。与往常一样,邻居的意思是由结构元素定义的,默认为3x3十字。

API文档

这个 mahotas.labeled 子模块包含上述功能。 label() 也可以通过以下方式获得 mahotas.label

mahotas.labeled.bbox(f, as_slice=False)

带标签的数组中所有对象的边界框。

之后::

bboxes = mh.labeled.bbox(f)

bboxes[34] 将包含 (f == 34)

参数:
f整数ndarray
as_slice布尔型,可选

是否返回切片对象而不是整数坐标(默认值:FALSE)。

退货:
bboxesNdarray

参见

mh.bbox

此函数的二进制版本

mahotas.labeled.border(labeled, i, j, Bc={3x3 cross}, out={np.zeros(labeled.shape, bool)}, always_return=True)

计算之间的边界区域 ij 地区。

如果像素有值,则它位于边框上 i (或 j )和其附近的像素(由 Bc )有价值 j (或 i )。

参数:
labeled整数类型的ndarray

输入标记数组

i整数
j整数
Bc结构元素,可选
out :ndarray形状相同 labeled ,dtype=bool,可选与形状相同的ndarray

存储输出的位置。如果 None ,则分配一个新的数组

always_return布尔值,可选

如果为False,则在边界上没有像素的情况下,返回 None 。否则(默认设置),它始终返回一个数组,即使该数组为空。

退货:
border_img布尔ndarray

像素是True,恰好是在 ij 在……里面 labeled

mahotas.labeled.borders(labeled, Bc={3x3 cross}, out={np.zeros(labeled.shape, bool)})

计算边框像素

如果像素有值,则它位于边框上 i 以及其邻域中的像素(由 Bc )有价值 ji != j

参数:
labeled整数类型的ndarray

输入标记数组

Bc结构元素,可选
out :ndarray形状相同 labeled ,dtype=bool,可选与形状相同的ndarray

存储输出的位置。如果 None ,则分配一个新的数组

mode{'reflect', 'nearest', 'wrap', 'mirror', 'constant' [default], 'ignore'}

如何处理边框

退货:
border_img布尔ndarray

像素在有边框的地方为True labeled

mahotas.labeled.bwperim(bw, n=4)

找出二值图像中对象的周长。

如果像素的值为1,并且其邻域中至少有一个零值像素,则该像素是对象周长的一部分。

默认情况下,像素的邻域是最近的4个像素,但如果 n 设置为8,则将考虑最近的8个像素。

参数:
bwNdarray

黑白图像(任何其他图像都将转换为黑白图像)

n整型,可选

连通性。必须是4或8(默认值:4)

mode{'reflect', 'nearest', 'wrap', 'mirror', 'constant' [default], 'ignore'}

如何处理边框

退货:
perimNdarray

布尔型图像

参见

borders

函数这是一个更一般的函数

mahotas.labeled.filter_labeled(labeled, remove_bordering=False, min_size=None, max_size=None)

基于一系列条件过滤标注区域

在 1.4.1 版本加入.

参数:
labeled标号数组
remove_bordering布尔值,可选

是否删除接触边界的区域

min_size整型,可选

要保留的对象的最小大小(以像素为单位)(默认为无最小值)

max_size整型,可选

要保留的对象的最大大小(以像素为单位)(默认为无最大值)

退货:
filtered标号数组
nr集成

新标签数量

mahotas.labeled.is_same_labeling(labeled0, labeled1)

检查是否 labeled0labeled1 表示相同的标签(即,除了标签值可能发生变化外,它们是否相同)。

请注意,背景(值0)的处理方式不同。即

IS_SAME_LABELING(a,b)表示np.all((a==0)==(b==0))

参数:
labeled0Ndarray of int

带标签的数组

labeled1Ndarray of int

带标签的数组

退货:
same布尔尔

如果作为参数传递的标注相等,则为True

参见

label

功能

relabel

功能

mahotas.labeled.label(array, Bc={3x3 cross}, output={new array})

标记数组,它被解释为二进制数组

这也被称为 connected component labeled ,其中连接性由结构化元素定义 Bc

请参阅:https://en.wikipedia.org/wiki/Connected-component_labeling

参数:
arrayNdarray

这将被解释为二进制数组

BcNdarray,可选

这是要使用的结构化元素

outNdarray,可选

输出数组。必须是np.int32类型的C数组

退货:
labeledNdarray

标记的结果

nr_objects集成

对象数量

mahotas.labeled.labeled_max(array, labeled, minlength=None)

标记为最小。 mins 将是一个大小为 labeled.max() + 1 ,在哪里 mins[i] 等于 np.min(array[labeled == i])

参数:
array任何类型的ndarray
labeled集成ndarray

标签地图。这与从返回的类型相同 mahotas.label()

退货:
mins :一维ndarray,共 array.dtype一维阵列,共
mahotas.labeled.labeled_size(labeled)

等同于:

for i in range(...):
    sizes[i] = np.sum(labeled == i)

但是,自然地,速度要快得多。

参数:
labeled集成ndarray
退货:
sizes一维整数线阵

参见

mahotas.fullhistogram

函数使用另一个名称几乎相同的函数(唯一的区别是该函数只接受无符号整数类型)。

mahotas.labeled.labeled_sum(array, labeled, minlength=None)

标记为SUM。Sum将是一个大小为 labeled.max() + 1 ,在哪里 sum[i] 等于 np.sum(array[labeled == i])

参数:
array任何类型的ndarray
labeled集成ndarray

标签地图。这与从返回的类型相同 mahotas.label()

minlength整型,可选

返回数组的最小大小。如果标签的数量少于 minlength 区域,0被添加到结果中。(可选)

退货:
sums :一维ndarray,共 array.dtype一维阵列,共
mahotas.labeled.perimeter(bwimage, n=4, mode='constant')

计算二值图像中所有对象的总周长。

参数:
bwimage数组

二值图像

n整型,可选

已传递给 bwperim 原样

mode字符串,可选

已传递给 bwperim 原样

退货:
p浮动

二值图像中所有对象的总周长

参见

bwperim

函数查找周长区域

参考文献

[1]

本克里德,D.克鲁克斯。周长估计器的设计与FPGA实现。贝尔法斯特女王大学。Https://www.cs.qub.ac.uk/~d.crookes/webpubs/papers/perimeter.doc

mahotas.labeled.relabel(labeled, inplace=False)

重新标记可确保 relabeled 是一种带标签的图像,因此从1到 relabeled.max() 被使用(0保留为背景并被传递)。

示例::

labeled,n = label(some_binary_map)
for region in range(n):
    if not good_region(labeled, region + 1):
        # This deletes the region:
        labeled[labeled == (region + 1)] = 0
relabel(labeled, inplace=True)
参数:
relabeledNdarray of int

带标签的数组

inplace布尔型,可选

是否就地执行重新标记,擦除中的值 labeled (默认:FALSE)

退货:
重新标记:ndarray
nr_objs集成

对象数量

参见

label

功能

mahotas.labeled.remove_bordering(labeled, rsize=1, out={np.empty_like(im)})

删除正在接触边框的对象。

经过 labeled AS out 实现就地作业。

参数:
labeledNdarray

标号数组

rsize整型或元组,可选

允许对象存活的到边界的最小距离(以曼哈坦距离表示)。可以是整数或元组,其中len==labeled.ndim。

outNdarray,可选

如果 im 被作为 out ,然后它以内联方式运行。

退货:
slabeledNdarray

的子集 labeled

mahotas.labeled.remove_regions(labeled, regions, inplace=False)

REMOVERED=REMOVE_REGIONS(已标记,REGIONS,INPLACE=FALSE):

删除中的区域 regions 。如果以元素为基础 in 运算符存在,则等同于::

labeled[ labeled element-wise-in regions ] = 0

此函数 does not 重新标记它的论点。您可以使用 relabel 函数::

removed = relabel(remove_regions(labeled, regions))

或者,保存一个映像分配::

removed = relabel(remove_regions(labeled, regions), inplace=True)

这是相同的,但在重新标记操作中重复使用内存。

参数:
relabeledNdarray of int

带标签的数组

regions整型序列

这些区域将被移除

inplace布尔型,可选

是否就地执行删除,擦除中的值 labeled (默认:FALSE)

退货:
removedNdarray

参见

relabel

功能删除不必要的区域后,重新标记您的标签图像通常是一个好主意。

mahotas.labeled.remove_regions_where(labeled, conditions, inplace=False)

基于布尔数组移除区域

如果出现以下情况,则删除区域 conditions[region-id] 计算结果为True。

此函数 does not 重新标记它的论点。您可以使用 relabel 函数::

removed = relabel(remove_regions_where(labeled, conditions))

或者,保存一个映像分配::

removed = relabel(remove_regions(labeled, conditions), inplace=True)

这是相同的,但在重新标记操作中重复使用内存。

参见

remove_regions

使用整数索引的此函数的函数变体