轉載鏈接:
https://www.cnblogs.com/wangxiaocvpr/p/11656589.html
圖像簡單濾波
對圖像進行濾波,可以有兩種效果:一種是平滑濾波,用來抑制噪聲;另一種是微分算子,可以用來檢測邊緣和特征提取。
skimage庫中通過filters模塊進行濾波操作。
1、sobel算子
sobel算子可用來檢測邊緣
函數格式為:
None
from

2、roberts算子
roberts算子和sobel算子一樣,用於檢測邊緣
調用格式也是一樣的:
edges = filters.roberts(img)
3、scharr算子
功能同sobel,調用格式:
edges = filters.scharr(img)
4、prewitt算子
功能同sobel,調用格式:
edges = filters.prewitt(img)
5、canny算子
canny算子也是用於提取邊緣特征,但它不是放在filters模塊,而是放在feature模塊
函數格式:
skimage.feature.canny(image,sigma=1.0)
可以修改sigma的值來調整效果
from

從結果可以看出,sigma越小,邊緣線條越細小。
6、gabor濾波
gabor濾波可用來進行邊緣檢測和紋理特征提取。
函數調用格式:
skimage
通過修改frequency值來調整濾波效果,返回一對邊緣結果,一個是用真實濾波核的濾波結果,一個是想象的濾波核的濾波結果。
from

以上為frequency=0.6的結果圖。

以上為frequency=0.1的結果圖
7、gaussian濾波
多維的濾波器,是一種平滑濾波,可以消除高斯噪聲。
調用函數為:
skimage
通過調節sigma的值來調整濾波效果
from

可見sigma越大,過濾后的圖像越模糊
8.median
中值濾波,一種平滑濾波,可以消除噪聲。
需要用skimage.morphology模塊來設置濾波器的形狀。
from

從結果可以看出,濾波器越大,圖像越模糊。
9、水平、垂直邊緣檢測
上邊所舉的例子都是進行全部邊緣檢測,有些時候我們只需要檢測水平邊緣,或垂直邊緣,就可用下面的方法。
水平邊緣檢測:sobel_h, prewitt_h, scharr_h
垂直邊緣檢測: sobel_v, prewitt_v, scharr_v
from

上邊左圖為檢測出的水平邊緣,右圖為檢測出的垂直邊緣。
10、交叉邊緣檢測
可使用Roberts的十字交叉核來進行過濾,以達到檢測交叉邊緣的目的。這些交叉邊緣實際上是梯度在某個方向上的一個分量。
其中一個核:
0 1
-1 0
對應的函數:
roberts_neg_diag(image)
例:
from

另外一個核:
1 0
0 -1
對應函數為:
roberts_pos_diag(image)
from

圖像自動閾值分割
圖像閾值分割是一種廣泛應用的分割技術,利用圖像中要提取的目標區域與其背景在灰度特性上的差異,把圖像看作具有不同灰度級的兩類區域(目標區域和背景區域)的組合,選取一個比較合理的閾值,以確定圖像中每個像素點應該屬於目標區域還是背景區域,從而產生相應的二值圖像。
在skimage庫中,閾值分割的功能是放在filters模塊中。
我們可以手動指定一個閾值,從而來實現分割。也可以讓系統自動生成一個閾值,下面幾種方法就是用來自動生成閾值。
1、threshold_otsu
基於Otsu的閾值分割方法,函數調用格式:
skimage.filters.threshold_otsu(image, nbins=256)
參數image是指灰度圖像,返回一個閾值。
from
返回閾值為87,根據87進行分割得下圖:

2、threshold_yen
使用方法同上:
thresh = filters.threshold_yen(image)
返回閾值為198,分割如下圖:

3、threshold_li
使用方法同上:
thresh = filters.threshold_li(image)
返回閾值64.5,分割如下圖:

4、threshold_isodata
閾值計算方法:
=
使用方法同上:
thresh = filters.threshold_isodata(image)
返回閾值為87,因此分割效果和threshold_otsu一樣。
5、threshold_adaptive
調用函數為:
'gaussian'
block_size: 塊大小,指當前像素的相鄰區域大小,一般是奇數(如3,5,7。。。)
method: 用來確定自適應閾值的方法,有'mean', 'generic', 'gaussian' 和 'median'。省略時默認為gaussian
該函數直接訪問一個閾值后的圖像,而不是閾值。
from

大家可以修改block_size的大小和method值來查看更多的效果。如:
'mean'
兩種效果如下:

基本圖形的繪制
圖形包括線條、圓形、橢圓形、多邊形等。
在skimage包中,繪制圖形用的是draw模塊,不要和繪制圖像搞混了。
1、畫線條
函數調用格式為:
skimage
r1,r2: 開始點的行數和結束點的行數
c1,c2: 開始點的列數和結束點的列數
返回當前繪制圖形上所有點的坐標,如:
rr, cc =draw.line(1, 5, 8, 2)
表示從(1,5)到(8,2)連一條線,返回線上所有的像素點坐標[rr,cc]
from

如果想畫其它顏色的線條,則可以使用set_color()函數,格式為:
skimage
例:
draw
則繪制紅色線條。
from

2、畫圓
函數格式:
skimage
cy和cx表示圓心點,radius表示半徑
from

3、多邊形
函數格式:
skimage
Y為多邊形頂點的行集合,X為各頂點的列值集合。
from

我在此處只設置了四個頂點,因此是個四邊形。
4、橢圓
格式:
skimage
cy和cx為中心點坐標,yradius和xradius代表長短軸。
from

5、貝塞兒曲線
格式:
skimage
y1,x1表示第一個控制點坐標
y2,x2表示第二個控制點坐標
y3,x3表示第三個控制點坐標
weight表示中間控制點的權重,用於控制曲線的彎曲度。
from

6、畫空心圓
和前面的畫圓是一樣的,只是前面是實心圓,而此處畫空心圓,只有邊框線。
格式:
skimage
yx,yc是圓心坐標,radius是半徑
from

7、空心橢圓
格式:
skimage
cy,cx表示圓心
yradius,xradius表示長短軸
from

基本形態學濾波
對圖像進行形態學變換。變換對象一般為灰度圖或二值圖,功能函數放在morphology子模塊內。
1、膨脹(dilation)
原理:一般對二值圖像進行操作。找到像素值為1的點,將它的鄰近像素點都設置成這個值。1值表示白,0值表示黑,因此膨脹操作可以擴大白色值范圍,壓縮黑色值范圍。一般用來擴充邊緣或填充小的孔洞。
功能函數:
None
selem表示結構元素,用於設定局部區域的形狀和大小。
from
分別用邊長為5或15的正方形濾波器對棋盤圖片進行膨脹操作,結果如下:

可見濾波器的大小,對操作結果的影響非常大。一般設置為奇數。
除了正方形的濾波器外,濾波器的形狀還有一些,現列舉如下:
morphology
注意,如果處理圖像為二值圖像(只有0和1兩個值),則可以調用:
None
用此函數比處理灰度圖像要快。
2、腐蝕(erosion)
函數:
None
selem表示結構元素,用於設定局部區域的形狀和大小。
和膨脹相反的操作,將0值擴充到鄰近像素。擴大黑色部分,減小白色部分。可用來提取骨干信息,去掉毛刺,去掉孤立的像素。
from

注意,如果處理圖像為二值圖像(只有0和1兩個值),則可以調用:
None
用此函數比處理灰度圖像要快。
3、開運算(opening)
函數:
None
selem表示結構元素,用於設定局部區域的形狀和大小。
先腐蝕再膨脹,可以消除小物體或小斑塊。
from

注意,如果處理圖像為二值圖像(只有0和1兩個值),則可以調用:
None
用此函數比處理灰度圖像要快。
4、閉運算(closing)
函數:
None
selem表示結構元素,用於設定局部區域的形狀和大小。
先膨脹再腐蝕,可用來填充孔洞。
from

注意,如果處理圖像為二值圖像(只有0和1兩個值),則可以調用:
None
用此函數比處理灰度圖像要快。
5、白帽(white-tophat)
函數:
None
selem表示結構元素,用於設定局部區域的形狀和大小。
將原圖像減去它的開運算值,返回比結構化元素小的白點
from

6、黑帽(black-tophat)
函數:
None
selem表示結構元素,用於設定局部區域的形狀和大小。
將原圖像減去它的閉運算值,返回比結構化元素小的黑點,且將這些黑點反色。
from

高級濾波
本文提供更多更強大的濾波方法,這些方法放在filters.rank子模塊內。
這些方法需要用戶自己設定濾波器的形狀和大小,因此需要導入morphology模塊來設定。
1、autolevel
這個詞在photoshop里面翻譯成自動色階,用局部直方圖來對圖片進行濾波分級。
該濾波器局部地拉伸灰度像素值的直方圖,以覆蓋整個像素值范圍。
格式:
skimage
selem表示結構化元素,用於設定濾波器。
from

2、bottomhat 與 tophat
bottomhat: 此濾波器先計算圖像的形態學閉運算,然后用原圖像減去運算的結果值,有點像黑帽操作。
bophat: 此濾波器先計算圖像的形態學開運算,然后用原圖像減去運算的結果值,有點像白帽操作。
格式:
skimage
selem表示結構化元素,用於設定濾波器。
下面是bottomhat濾波的例子:
from

3、enhance_contrast
對比度增強。求出局部區域的最大值和最小值,然后看當前點像素值最接近最大值還是最小值,然后替換為最大值或最小值。
函數:
enhance_contrast(image, selem)
selem表示結構化元素,用於設定濾波器。
from

4、entropy
求局部熵,熵是使用基為2的對數運算出來的。該函數將局部區域的灰度值分布進行二進制編碼,返回編碼的最小值。
函數格式:
entropy(image, selem)
selem表示結構化元素,用於設定濾波器。
from

5、equalize
均衡化濾波。利用局部直方圖對圖像進行均衡化濾波。
函數格式:
equalize(image, selem)
selem表示結構化元素,用於設定濾波器。
from

6、gradient
返回圖像的局部梯度值(如:最大值-最小值),用此梯度值代替區域內所有像素值。
函數格式:
gradient(image, selem)
selem表示結構化元素,用於設定濾波器。
from

7、其它濾波器
濾波方式很多,下面不再一一詳細講解,僅給出核心代碼,所有的函數調用方式都是一樣的。
最大值濾波器(maximum):返回圖像局部區域的最大值,用此最大值代替該區域內所有像素值。
dst =sfr.maximum(img, disk(5))
最小值濾波器(minimum):返回圖像局部區域內的最小值,用此最小值取代該區域內所有像素值。
dst =sfr.minimum(img, disk(5))
均值濾波器(mean) : 返回圖像局部區域內的均值,用此均值取代該區域內所有像素值。
dst =sfr.mean(img, disk(5))
中值濾波器(median): 返回圖像局部區域內的中值,用此中值取代該區域內所有像素值。
dst =sfr.median(img, disk(5))
莫代爾濾波器(modal) : 返回圖像局部區域內的modal值,用此值取代該區域內所有像素值。
dst =sfr.modal(img, disk(5))
otsu閾值濾波(otsu): 返回圖像局部區域內的otsu閾值,用此值取代該區域內所有像素值。
dst =sfr.otsu(img, disk(5))
閾值濾波(threshhold): 將圖像局部區域中的每個像素值與均值比較,大於則賦值為1,小於賦值為0,得到一個二值圖像。
dst =sfr.threshold(img, disk(5))
減均值濾波(subtract_mean): 將局部區域中的每一個像素,減去該區域中的均值。
dst =sfr.subtract_mean(img, disk(5))
求和濾波(sum) :求局部區域的像素總和,用此值取代該區域內所有像素值。
dst =sfr.sum(img, disk(5))