1.skimage.segmentation.clear_border函數
python基礎教程pdf?clear_border(labels, buffer_size=0, bgval=0, in_place=False)主要作用是清除二值圖像中邊界的1值。例如
>>> import numpy as np>>> from skimage.segmentation import clear_border>>> labels = np.array([[0, 0, 0, 0, 0, 0, 0, 1, 0],... [0, 0, 0, 0, 1, 0, 0, 0, 0],... [1, 0, 0, 1, 0, 1, 0, 0, 0],... [0, 0, 1, 1, 1, 1, 1, 0, 0],... [0, 1, 1, 1, 1, 1, 1, 1, 0],... [0, 0, 0, 0, 0, 0, 0, 0, 0]])>>> clear_border(labels)array([[0, 0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 1, 0, 0, 0, 0],[0, 0, 0, 1, 0, 1, 0, 0, 0],[0, 0, 1, 1, 1, 1, 1, 0, 0],[0, 1, 1, 1, 1, 1, 1, 1, 0],[0, 0, 0, 0, 0, 0, 0, 0, 0]])
2.skimage.measure.label函數
在skimage包中,使用measure子模塊下的label函數即可實現連通區域標記。參數input表示需要處理的二值圖像,connectivity表示判定連通的模式(1代表4連通,2代表8連通),輸出labels為一個從0開始的標記數組。
neighbors:{4,8},int,可選是否使用4或8“連接”。在3D中,4“連接”意味著連接的像素在這個像素點的三個坐標截面(xyz)中任意一個存在4連通,共2+2+2=6種像素點。而對于8-“連通性”意味著連接的像素在這個像素點的任意截面中存在一截面存在8連通即可,共3×3×3-1=26種像素點。 **不推薦使用,
x = [[[1,0,1],[0,1,0],[0,0,1]],[[1,0,0],[0,0,0],[0,0,1]],[[1,0,0],[0,1,0],[0,0,1]]]
x=np.array(x)
print(label(x, neighbors=4))[[[1 0 2][0 3 0][0 0 4]][[1 0 0][0 0 0][0 0 4]][[1 0 0][0 5 0][0 0 4]]]x = [[[1,0,1],[0,1,0],[0,0,1]],[[1,0,0],[0,0,0],[0,0,1]],[[1,0,0],[0,1,0],[0,0,1]]]
x=np.array(x)
print(label(x, neighbors=8))[[[1 0 1][0 1 0][0 0 1]][[1 0 0][0 0 0][0 0 1]][[1 0 0][0 1 0][0 0 1]]]
>>> import numpy as np
>>> x = np.eye(3).astype(int)
>>> print(x)
[[1 0 0][0 1 0][0 0 1]]
>>> print(label(x, connectivity = 1))
[[1 0 0][0 2 0][0 0 3]]
>>> print(label(x, connectivity = 2))
[[1 0 0][0 1 0][0 0 1]]
>>> print(label(x, background = -1))
[[1 2 2][2 1 2][2 2 1]]
>>> x = np.array([[1, 0, 0],
... [1, 1, 5],
... [0, 0, 0]])
>>> print(label(x))
[[1 0 0][1 1 2][0 0 0]]
?
3.skimage.measure.regionprops函數
此外,使用measure子模塊中的regionprops()函數可以很方便地對每一個連通區域進行屬性獲取和操作,比如計算面積、外接矩形、凸包面積等等。
計算結果返回為所有連通區域的屬性列表,列表長度為連通區域個數(第i個連通區域的attribute屬性可以通過properties[i].attribute獲取)。
Notes ----- The following properties can be accessed as attributes or keys:
**area** : int Number of pixels of region.
**bbox** : tuple Bounding box ``(min_row, min_col, max_row, max_col)`
**label** : int The label in the labeled input image.
在三維中bbox表示連通區域所有點中最小的xyz,以及最大的xyz加上1.
x = [[[1,0,0],[0,0,0],[0,0,1]],[[1,0,0],[0,0,0],[0,0,1]],[[0,0,0],[0,0,0],[0,0,1]]]
x=np.array(x)
x1=label(x, neighbors=8)
print(x1)
regions = regionprops(x1)
print(regions[0].bbox)
print(regions[0].area)[[[1 0 0][0 0 0][0 0 2]][[1 0 0][0 0 0][0 0 2]][[0 0 0][0 0 0][0 0 2]]]
(0L, 0L, 0L, 2L, 1L, 1L)
2
4.Python函數 dict()。
作用:dict()?函數用于創建一個字典。返回一個字典。
5.Python?enumerate() 函數
enumerate() 函數用于將一個可遍歷的數據對象(如列表、元組或字符串)組合為一個索引序列,同時列出數據和數據下標,一般用在 for 循環當中。
以下是 enumerate() 方法的語法:enumerate(sequence, [start=0])
返回 enumerate(枚舉) 對象。
>>>seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1)) # 下標從 1 開始
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
普通的 for 循環
>>>i = 0
>>> seq = ['one', 'two', 'three']
>>> for element in seq:
... print i, seq[i]
... i +=1
...
0 one
1 two
2 three
for 循環使用 enumerate
>>>seq = ['one', 'two', 'three']
>>> for i, element in enumerate(seq):
... print i, element
...
0 one
1 two
2 three
6.skimage.morphology.binary_dilation(image,?selem=None)函數二值圖像的膨脹。
原理:一般對二值圖像進行操作。找到像素值為1的點,將它的鄰近像素點都設置成這個值。1值表示白,0值表示黑,因此膨脹操作可以擴大白色值范圍,壓縮黑色值范圍。一般用來擴充邊緣或填充小的孔洞。
selem表示結構元素,用于設定局部區域的形狀和大小。
分別用邊長為5或15的正方形濾波器對棋盤圖片進行膨脹操作,結果如下:
可見濾波器的大小,對操作結果的影響非常大。一般設置為奇數。
除了正方形的濾波器外,濾波器的形狀還有一些,現列舉如下:
morphology.square: 正方形
morphology.disk: ?平面圓形#disk_12 = disk(6, dtype=np.bool)半徑為6的圓形濾波器
morphology.ball: 球形
morphology.cube: 立方體形
morphology.diamond: 鉆石形
morphology.rectangle: 矩形
morphology.star: 星形
morphology.octagon:?八角形
morphology.octahedron: 八面體
注意,如果處理圖像為非二值圖像(只有0和1兩個值),則可以調用:
skimage.morphology.dilation(image,?selem=None)
7.skimage.morphology.binary_erosion(image,?selem=None)二值圖像腐蝕操作。
原理:和膨脹相反的操作,將0值擴充到鄰近像素。擴大黑色部分,減小白色部分。可用來提取骨干信息,去掉毛刺,去掉孤立的像素。
selem表示結構元素,用于設定局部區域的形狀和大小。
用邊長為5和25的正方形濾波器進行腐蝕濾波結果如下:
注意,如果處理圖像為非二值圖像(只有0和1兩個值),則可以調用:
skimage.morphology.erosion(image,?selem=None)
前面兩點參考:https://blog.csdn.net/haoji007/article/details/52063306。這里邊是基本濾波學蠻全的很好!!!
?
8.skimage.morphology.remove_small_holes(ar, min_size=64, connectivity=1, in_place=False):
移除小于指定尺寸的連續孔,去掉中間的小塊(例子為值為0的區域)。
Examples
--------
>>> from skimage import morphology
>>> a = np.array([[1, 1, 1, 1, 1, 0],
... [1, 1, 1, 0, 1, 0],
... [1, 0, 0, 1, 1, 0],
... [1, 1, 1, 1, 1, 0]], bool)
>>> b = morphology.remove_small_holes(a, 2)#最小值設為2了,默認4連通
>>> b
array([[ True, True, True, True, True, False],[ True, True, True, True, True, False],[ True, False, False, True, True, False],[ True, True, True, True, True, False]], dtype=bool)
>>> c = morphology.remove_small_holes(a, 2, connectivity=2)
>>> c
array([[ True, True, True, True, True, False],[ True, True, True, False, True, False],[ True, False, False, True, True, False],[ True, True, True, True, True, False]], dtype=bool)
>>> d = morphology.remove_small_holes(a, 2, in_place=True)
>>> d is a
True
9.skimage.morphology.binary_closing(image,?selem=None)閉運算函數(非二值化圖像skimage.morphology.closing)
selem表示結構元素,用于設定局部區域的形狀和大小。
先膨脹再腐蝕,可用來填充孔洞。
用邊長為9的圓形濾波器進行閉運算結果如下:
反之還有skimage.morphology.binary_opening(image,?selem=None)開運算函數(非二值化圖像skimage.morphology.opening)
selem表示結構元素,用于設定局部區域的形狀和大小。
先腐蝕再膨脹,可以消除小物體或小斑塊。
用邊長為9的圓形濾波器進行開運算結果如下:
這里還是參考:https://blog.csdn.net/haoji007/article/details/52063306。代碼里面是ball(3)的立體閉運算。說明可以在三維上用。
ps:2019年6月26號,關于skimage庫好的攻略:https://www.jianshu.com/p/f2e88197e81d
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态