python之skimage模塊應用

可以用來做圖像做處理的模塊有很多,不過對於使用python不熟悉,或者剛使用python做圖像處理的時候,經常不知道應該選擇使用哪些模塊。比如,scipy中misc和ndimage中都有相應的圖像處理函數,現在就介紹一下scikit-image模塊吧:

1)例圖: 

from skimage import data
data裏面會有樣圖,如data.camera()是一張(512, 512)的圖;



2)濾波

from skimage import filters
比如高斯濾波,filters.gaussian(camera, 1)

比如邊緣檢測:filters.sobel(camera)



3)文件讀取

from skimage import io

io.imread(filename),其中,filename也可以是URL地址;

io.imsave(path, img).



4)數據類型轉換

from skimage import img_as_float

camera_f = img_as_float(camera)將原圖uint8類型轉變成[-1, 1]之間的範圍;




5)顏色空間轉換

from skimage import color

color.rgb2hsvcolor.lab2rgb, etc.



關於圖像預處理和增強

6)局部濾波,如filters.sobel_h(img)



7)非局部濾波,如

rom skimage import exposure

中exposure.equalize_hist(img)做直方圖均衡;




8)數學形態變換

from skimage import morphology
具體圖形生成:比如morphology.diamond(1)生成菱形;

腐蝕操作:morphology.binary_erosion(img, selem=None)

selem表示結構元素,用於設定局部區域的形狀和大小。將0值擴充到鄰近像素。擴大黑色部分,減小白色部分。可用來提取骨幹信息,去掉毛刺,去掉孤立的像素。

膨脹操作:morphology.binary)dilation(img, selem = None)

一般對二值圖像進行操作。找到像素值爲1的點,將它的鄰近像素點都設置成這個值。1值表示白,0值表示黑,因此膨脹操作可以擴大白色值範圍,壓縮黑色值範圍。一般用來擴充邊緣或填充小的孔洞。

Opening: erosion + dilation

注:該操作也適用於非二值圖,即灰度圖,對應的是最小濾波

(scipy.ndimage.morphology同樣也有該操作)




9)圖像分割

基於直方圖分析的二值分割:(Otsu閾值法)如:val = filters.threshold(img)找到閾值,然後通過mask = img < val得到二值圖

圖像打標籤:對於分割後的圖像,可以給每一個區域打標籤,如

from skimage import measure

all_labels = measure.label(blobs)

另外,scipy中也有相應操作;

水域分割算法(也叫分水嶺算法): 

from skimage.morphology import watershed 
from skimage.feature import peak_local_max

from scipy import ndimage
>>> distance = ndimage.distance_transform_edt(image)
>>> local_maxi = peak_local_max(distance, indices=False, footprint=np.ones((3, 3)), labels=image)
>>> markers = morphology.label(local_maxi)
>>> labels_ws = watershed(-distance, markers, mask=image) 另一個隨機walker分割

from skimage import segmentation
>>> # Transform markers image so that 0-valued pixels are to
>>> # be labelled, and -1-valued pixels represent background
>>> markers[~image] = -1
>>> labels_rw = segmentation.random_walker(image, markers)




10)測量區域屬性,如面積和周長

properties = measure.regionprops(labels_rw)
>>> [prop.area for prop in properties]
[770, 1168]
>>> [prop.perimeter for prop in properties]
[100.91…, 126.81…]



11)數據可視化和交互

matplotlib中提供了plt.imshow等函數,結合以上濾波、分割(segmentation.clear_border(mask))等使用

另外,skimage也提供顯示圖像的函數,不過也是基於matplotlib,貌似功能更強大:

from skimage import viewer
>>> new_viewer = viewer.ImageViewer(coins)
>>> new_viewer.show()

For more interaction, plugins can be added to the viewer:

>>>
>>> new_viewer = viewer.ImageViewer(coins) 
>>> from skimage.viewer.plugins import lineprofile
>>> new_viewer += lineprofile.LineProfile()
>>> new_viewer.show()




12)CV中的特徵提取

from skimage import feature

不同角點特徵:

from skimage.feature import corner_harris, corner_subpix, corner_peaks

//補充角點特徵知識點

另外skimage.transform提供扭曲和仿射變換操作wrap和AffineTransform

//待補充其它特徵提取函數

發佈了9 篇原創文章 · 獲贊 58 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章