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(ar,?min_size=64,?connectivity=1,?in_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)。
總結
以上是生活随笔為你收集整理的morphology.remove_small_objects输入数组的数据类型对结果的影响的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言链表拆分
- 下一篇: JavaScript 实现空间直角坐标系