morphology.remove_small_objects输入数组的数据类型对结果的影响

目录

当ar数据类型为int时:

当ar数据类型为bool时:

总结:


skimage中morphology.remove_small_objects 用以去除小于指定size的小物体(Remove objects smaller than the specified size).

skimage.morphology.remove_small_objects(armin_size=64connectivity=1in_place=False*out=None)

官方文档指出:

Expects ar to be an array with labeled objects, and removes objects smaller than min_size. If ar is bool, the image is first labeled. This leads to potentially different behavior for bool and 0-and-1 arrays.

ar可以是int型,也可以是bool型。但是经本人试验,当ar分别为这两种数据类型时,结果差异还是比较明显的。

当ar数据类型为int时

创建img_1和img_2两个数组。数组中0为背景,非0元素为objects。img_1中包含背景0和object 67;img_2中包含背景0、object67、object1、object2。使用morphology.remove_small_objects分别处理img_1和img_2,以除去size小于3的objects。

import numpy as np
from skimage import morphology
img_1 = np.array([
            [0,0,0,67,67,67],
            [0,67,0,67,0,67],
            [0,0,0,0,67,0],
            [0,67,67,0,0,67],
            ])
img_2 = np.array([
            [0,0,0,67,67,67],
            [0,1,0,67,0,67],
            [0,0,0,0,67,0],
            [0,67,2,0,0,67],
            ])
img_1_small_removed = morphology.remove_small_objects(img_1,min_size=3,connectivity=1)
print('img_1_small_removed =')
print(img_1_small_removed)
img_2_small_removed = morphology.remove_small_objects(img_2,min_size=3,connectivity=1)
print('img_2_small_removed =')
print(img_2_small_removed)

结果如下 :

img_1_small_removed =
[[ 0  0  0 67 67 67]
 [ 0 67  0 67  0 67]
 [ 0  0  0  0 67  0]
 [ 0 67 67  0  0 67]]
img_2_small_removed =
[[ 0  0  0 67 67 67]
 [ 0  0  0 67  0 67]
 [ 0  0  0  0 67  0]
 [ 0 67  0  0  0 67]]

由结果可见,img_1中第二行第二列的孤立object 67未被去除,但是,img_2中第二行第二列孤立的object 1被去除了。此外,img_2中第四行第三列的object 2也被去除了,注意object 2周围的元素并非都是0,其左侧存在object 67。

由上例可见,当ar数据类型为int时,morphology.remove_small_objects去除的是数组中个数少于min_size的objects(img_2中的object 1和object 2)。无论被去除的object周围元素是0还是其他object,只要该object在数组中的个数少于min_size,它就要被remove。img_1中第二行第二列元素是孤立的,其周围元素都是背景0,但是该元素所属的object 67在数组中的总量是大于min_size的,所以即便该元素是孤立的,其也未被remove。

当ar数据类型为bool时

首先,将img_1和img_2数据类型转化为bool,大于0的元素为True,等于0的元素为False。即之前的objects是现在的True,之前的背景0为现在的False。

然后,使用morphology.remove_small_objects分别处理img_1_bools和img_2_bools,以除去size小于3的objects。

import numpy as np
from skimage import morphology
img_1 = np.array([
            [0,0,0,67,67,67],
            [0,67,0,67,0,67],
            [0,0,0,0,67,0],
            [0,67,67,0,0,67],
            ])
img_2 = np.array([
            [0,0,0,67,67,67],
            [0,1,0,67,0,67],
            [0,0,0,0,67,0],
            [0,67,2,0,0,67],
            ])
img_1_bools = img_1 > 0
img_2_bools = img_2 > 0
img_1_small_removed = morphology.remove_small_objects(img_1_bools,min_size=3,connectivity=1)
img_2_small_removed = morphology.remove_small_objects(img_2_bools,min_size=3,connectivity=1)
print('img_1_bools =')
print(img_1_bools)
print('img_1_small_removed =')
print(img_1_small_removed)
print('img_2_bools =')
print(img_2_bools)
print('img_2_small_removed =')
print(img_2_small_removed)

 结果如下:

img_1_bools =
[[False False False  True  True  True]
 [False  True False  True False  True]
 [False False False False  True False]
 [False  True  True False False  True]]
img_1_small_removed =
[[False False False  True  True  True]
 [False False False  True False  True]
 [False False False False False False]
 [False False False False False False]]
img_2_bools =
[[False False False  True  True  True]
 [False  True False  True False  True]
 [False False False False  True False]
 [False  True  True False False  True]]
img_2_small_removed =
[[False False False  True  True  True]
 [False False False  True False  True]
 [False False False False False False]
 [False False False False False False]]

由于img_1_bools和img_2_bools两个数组一模一样,所以对二者处理后结果也一模一样。

img_1_bools中第二行第二列的True被移除了(对应img_1中同位置的67),第三行倒数第二列的True被移除了(对应img_1中同位置的67),第四行第二列和第三列的True被移除了(对应img_1中同位置的67和67),第四行最后一列的True被移除了(对应img_1中同位置的67)。

img_2_bools中第二行第二列的True被移除了(对应img_2中同位置的1),第三行倒数第二列的True被移除了(对应img_2中同位置的67),第四行第二列和第三列的True被移除了(对应img_2中同位置的67和2),第四行最后一列的True被移除了(对应img_2中同位置的67)。

注意:在img_1_bools中元素True的数量是远多于min_size的,但是孤立的True们都被remove了。与之对应的,数组数据类型为int时,孤立的object 67并未被remove。

总结:

当输入数组ar的数据类型为int时,morphology.remove_small_objects除去的是数组中元素总个数少于min_size的objects(每种值代表一种object),无论被remove的object是否孤立。

当输入数组ar的数据类型为bool时,morphology.remove_small_objects除去的是数组中孤立的,size小于min_size的True们(这里的True们有可能在int型数组中对应不同的值,即对应不同的objects)。


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值