2017-02-19 8 views
1

最近、python skimageのローカルバイナリパターンメソッドが予期しない結果を引き起こしている問題が発生しています。ローカルバイナリパターンの予期しない動作 - python skimage

以下の漫画の例をご覧ください。これは、平坦な色の背景に2つの平らな色の円を示しています。

circles

ローカルバイナリパターン(P = 8つのサンプル、半径= 1)が出力される。

lbp

(画像ジェット色で色分けされて)。灰色は正しく255を表します。ただし、青色は85(バイナリ01010101)です。

この方法では、右に255の背景と円が表示されていますが、左の円は85と表示されます。スキマージュのローカルバイナリパターンメソッドは、その領域が完全にノイズが多いと考えます(したがって、 01010101)。しかし、上記の青色で示された領域内の個々のピクセルを二重チェックし、それらの値が同じである(つまり、フラットカラーの背景や他のフラットなカラーサークルのようなフラットカラー)ので、これは当てはまりません。

誰も以前に同様の問題が発生しましたか?

from skimage.feature import local_binary_pattern 
from skimage.color import rgb2gray 
import matplotlib.pyplot as plt 

img = plt.imread('circles.png') 
img = rgb2gray(img) 

lbp = local_binary_pattern(img, 8, 1, 'default') 
plt.imshow(lbp, cmap='nipy_spectral') 
plt.title('Standard lbp (8,1)') 
+1

をPNGが読み込まれ、デフォルトでは、ほんの少しすることができ浮動小数点配列、にうるさい。次のステップを追加すれば、物事は安定するはずです: 'from skimage import img_as_ubyte; img = img_as_ubyte(img) ' –

答えて

1

私は問題が数値のエラーが原因であると思います。ここでは

は、あなたがこれを複製する場合のコードです。カラー画像が

img = plt.imread('circles.png') 

使用して読み取られるときに、タイプfloat32の配列を取得し、次の変換で得られた画像は、タイプfloat64である

img = skimage.color.rgb2gray(img) 

グレースケールします。

中間段階を避けることをおすすめします。あなたは非常にこのように最初から(つまりfloat64)倍精度で画像を読むことができる:

In [63]: from skimage.feature import local_binary_pattern 

In [64]: from skimage import io 

In [65]: img = io.imread('circles.png', as_grey=True) 

In [66]: img.dtype 
Out[66]: dtype('float64') 

In [67]: lbp = local_binary_pattern(img, 8, 1, 'default') 

In [68]: io.imshow(lbp/255., cmap='nipy_spectral') 
Out[68]: <matplotlib.image.AxesImage at 0x10bdd780> 

results