web-dev-qa-db-ja.com

画像のGLCMからエントロピーを計算する

ほとんどの画像分析作業にskimageライブラリを使用しています。

RGB画像があり、textureentropyenergyhomogeneityなどのcontrast機能を画像から抽出するつもりです。

以下は私が実行しているステップです:

from skimage import io, color, feature
from skimage.filters import rank
rgbImg = io.imread(imgFlNm)
grayImg = color.rgb2gray(rgbImg)
print(grayImg.shape)  # (667,1000), a 2 dimensional grayscale image

glcm = feature.greycomatrix(grayImg, [1], [0, np.pi/4, np.pi/2, 3*np.pi/4])
print(glcm.shape) # (256, 256, 1, 4)

rank.entropy(glcm, disk(5)) # throws an error since entropy expects a 2-D array in its arguments

rank.entropy(grayImg, disk(5)) # given an output.

私の質問は、グレースケール画像から計算されたエントロピーは(直接)GLCMから抽出されたエントロピー機能(テクスチャ機能)と同じですか?

そうでない場合、画像からすべてのテクスチャ機能を抽出する正しい方法は何ですか?

注:私はすでに言及しました:

エントロピー-skimage

GLCM-テクスチャ機能

11
Sreejith Menon

グレイスケール画像から計算されたエントロピーは(直接)GLCMから抽出されたエントロピー機能(テクスチャ機能)と同じですか?

いいえ、これら2つのエントロピーはかなり異なります。

  1. skimage.filters.rank.entropy(grayImg, disk(5))は、grayImgと同じサイズの配列を生成します。これには、対応するピクセルを中心とし、半径5ピクセルの円形ディスクで計算された画像全体のローカルエントロピーが含まれます。 Entropy(情報理論) を見て、エントロピーの計算方法を確認してください。この配列の値は、セグメンテーションに役立ちます(エントロピーベースのオブジェクト検出の例を表示するには、 このリンク に従ってください)。画像のエントロピーを単一の(スカラー)値で記述することが目的の場合は、skimage.measure.shannon_entropy(grayImg)を使用できます。この関数は、基本的に次の数式を画像全体に適用します。
    entropy
    場所 n はグレーレベルの数(8ビット画像の場合は256)、 probability は、グレーレベル を持つピクセルの確率です。intensity 、および base は対数関数の底です。いつ base が2に設定されている場合、戻り値はbitsで測定されます。
  2. グレーレベルの共起行列(GLCM)は、画像上の特定のオフセットで共起するグレースケール値のヒストグラムです。画像のテクスチャを説明するには、通常、異なるオフセットに対して計算されたいくつかの共起行列からエントロピー、エネルギー、コントラスト、相関などの特徴を抽出します。この場合、エントロピーは次のように定義されます。
    entropy of GLCM
    場所 nbase は、それぞれグレーレベルの数と対数関数の底であり、 GLCM element は、指定されたオフセットによって分離された2つのピクセルが強度 である確率を表しますintensityj 。残念ながらエントロピーは、scikit-imageで計算できるGLCMのプロパティの1つではありません*。この機能を計算する場合は、GLCMを skimage.measure.shannon_entropy に渡す必要があります。

*この投稿が最後に編集された時点では、scikit-imageの最新バージョンは0.13.1です。

そうでない場合、画像からすべてのテクスチャ機能を抽出する正しい方法は何ですか?

画像のテクスチャを記述するためのさまざまな機能があります。たとえば、ローカルバイナリパターン、ガボールフィルター、ウェーブレット、ローのマスクなどです。 Haralickの [〜#〜] glcm [〜#〜] は、最も人気のあるテクスチャ記述子の1つです。 GLCM機能を使用して画像のテクスチャを記述する1つの可能なアプローチは、さまざまなオフセット(各オフセットは距離と角度によって定義されます)のGLCMを計算し、各GLCMからさまざまなプロパティを抽出することです。

たとえば、3つの距離(1、2、3ピクセル)、4つの角度(0、45、90、135度)、2つのプロパティ(エネルギーと均一性)について考えてみましょう。これは になります12 オフセット(したがって12のGLCM)と次元の特徴ベクトル 24 。これがコードです:

import numpy as np
from skimage import io, color, img_as_ubyte
from skimage.feature import greycomatrix, greycoprops
from sklearn.metrics.cluster import entropy

rgbImg = io.imread('https://i.stack.imgur.com/1xDvJ.jpg')
grayImg = img_as_ubyte(color.rgb2gray(rgbImg))

distances = [1, 2, 3]
angles = [0, np.pi/4, np.pi/2, 3*np.pi/4]
properties = ['energy', 'homogeneity']

glcm = greycomatrix(grayImg, 
                    distances=distances, 
                    angles=angles,
                    symmetric=True,
                    normed=True)

feats = np.hstack([greycoprops(glcm, prop).ravel() for prop in properties])

この画像を使用して得られた結果:

sample image - lion

In [56]: entropy(grayImg)
Out[56]: 5.3864158185167534

In [57]: np.set_printoptions(precision=4)

In [58]: print(feats)
[ 0.026   0.0207  0.0237  0.0206  0.0201  0.0207  0.018   0.0206  0.0173
  0.016   0.0157  0.016   0.3185  0.2433  0.2977  0.2389  0.2219  0.2433
  0.1926  0.2389  0.1751  0.1598  0.1491  0.1565]
16
Tonechas
from skimage.feature import greycomatrix, greycoprops

    dis = (greycoprops(glcm, 'dissimilarity'))
    plt.hist(dis.ravel(), normed=True, bins=256, range=(0, 30),facecolor='0.5');plt.show()
0
Yehadska