2016-12-07 15 views
2

私はsci-kitイメージからmean filterを使用しています。しかし、浮動小数点画像のdtypeuint8に変更したように見えます。これは、もう一度他のフィルタ関数に渡すときに問題になります。scikit-image:平均フィルタの変更dtype

例として、次のコードを検討してください。

import numpy as np 
from skimage import filters 
from skimage.morphology import square 

def mean_filter(img): 
    selem = square(3) 
    print(img.dtype) 
    print(img.max(), img.min()) 
    fi = filters.rank.mean(img, selem=selem) 
    print(fi.dtype) 
    print(fi.max(), fi.min()) 
    return fi 

arr = np.array([[.1, .2, .3], 
       [.4, .5, .6], 
       [.7, .8, .9]], dtype='float64') 
m = mean_filter(arr) 

次の出力を行います。

float64 
0.9 0.1 
uint8 
178 76 

しかし、ドキュメントに従って、戻り値の型は入力型と同じでなければなりません。ここで何が起こっているのですか?

答えて

3

Scikit-imageのrankフィルタは、uint8uint16のデータ型に対してのみ定義されています。そのため、結果が得られるタイプのuint8に変換されています。例えば。

画像:それは言うdocumentation rank.mean、2-Dアレイ(UINT8、uint16の)

だから、入力uint8またはuint16が、skimage結果におけるそのデータ・タイプを保存する場合。さもなければ、それはあなたのイメージをボンネットのものの1つに変換しようとします。

>>> from scipy.ndimage import uniform_filter 
>>> size = 3 
>>> result = uniform_filter(arr, size) 

それともあれば空想、独自のフィルターを作成します:

>>> from scipy.ndimage import convolve1d 
>>> size = 3 
>>> kernel = np.ones(size, arr.dtype)/size 
>>> result = convolve1d(convolve1d(arr, kernel, axis=0), kernel, axis=1) 

注:上記separable convolutionと呼ばれているが、あなたが何ができるか

は、代わりに、scipyを使用しています。これは、最初にy軸の2つの1次元フィルタで画像を畳み込み、次にx軸を超えて(順序は関係ありません)画像を畳み込むことによって機能します。カーネル(フィルタ)が分離可能な場合、2つの1次元畳み込みを実行すると、1つの2D畳み込みを実行するよりも桁違いに速くなります(画像を2回畳み込む必要があります)。 Scipyのuniform_filterはこれをシーンの背後で行います。軸ごとに1度、uniform_filter1dに呼び出します。