Вычисление энтропии из GLCM изображения

Я использую skimage библиотека для большинства работ по анализу изображений.

у меня есть изображение RGB, и я намерен извлечь texture функции как entropy, energy, homogeneity и 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 - фактуру

2 ответов


является ли вычисленная энтропия из изображения серой шкалы (напрямую) такой же, как функция энтропии, извлеченная из GLCM (функция текстуры)?

нет, эти две энтропии довольно разные:

  1. skimage.filters.rank.entropy(grayImg, disk(5)) дает массив того же размера, что и grayImg который содержит локальную энтропию по изображению, вычисленному на круговом диске с центром в соответствующем пикселе и радиусом 5 пикселей. Взгляните на энтропия (информация теория) чтобы узнать, как вычисляется энтропия. Значения в этом массиве полезны для сегментации (follow этой ссылке чтобы увидеть пример обнаружения объектов на основе энтропии). Если ваша цель-описать энтропию изображения через одно (скалярное) значение, вы можете использовать skimage.measure.shannon_entropy(grayImg). Эта функция в основном применяет следующую формулу к полному изображению:
    entropy
    где n количество уровней серого (256 для 8-битных изображений), probability вероятность пикселя, имеющего серый уровень intensity и base является основой функции логарифма. Когда base установлено значение 2 возвращаемое значение измеряется в bits.
  2. матрица co-occurence серого уровня (GLCM)-это гистограмма одновременных значений оттенков серого при заданном смещении по изображению. Для описания текстуры изображения его обычно извлекают характеристики как энтропия, энергия, контраст, корреляция, etc. из нескольких матриц совместного вхождения, вычисленных для разных смещений. В этом случае энтропия определяется следующим образом:
    entropy of GLCM
    где n и base снова количество серых уровней и основание функции логарифма, соответственно, и GLCM element означает вероятность того, что два пикселя, разделенные указанным смещением, будут иметь интенсивность intensity и j. К сожалению энтропия не является одним из свойств GLCM, которые можно вычислить с помощью scikit-image*. Если вы хотите вычислить эту функцию, вам нужно передать GLCM в skimage.measure.shannon_entropy.

*на момент последнего редактирования этой записи последняя версия scikit-image-0.13.1.

если нет, то какое право способ извлечения всех текстурных объектов из изображения?

существует множество функций для описания текстуры изображения, например, локальные двоичные шаблоны, фильтры Габора, вейвлеты, маски законов и многие другие. Haralick это GLCM является одним из самых популярных дескрипторов текстуры. Один из возможных подходов к описанию текстуры изображения с помощью функций GLCM заключается в вычислении GLCM для различных смещений (каждое смещение определяется через расстояние и угол), и извлечение различных свойств из каждого GLCM.

рассмотрим, например, три расстояния (1, 2 и 3 пикселя), четыре угла (0, 45, 90 и 135 градусов) и два свойства (энергия и однородность). Это приводит к 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]

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()