2016-12-01 15 views
7

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

У меня есть 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 (функция текстуры)?

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

Примечание: Я уже упоминали:

Entropy - skimage

GLCM - Texture features

ответ

12

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

Нет, эти два энтропий весьма различны:

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

* В то время это сообщение последний раз редактировал, последняя версия scikit-изображения 0.13.1.

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

Существует множество возможностей для описания текстуры изображения, например, локальных двоичных паттернов, фильтров Габора, всплесков, масок законов и многих других. Haralick's 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] 
+0

Большое спасибо! Это помогло .. –

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

Не могли бы вы уточнить ваш ответ? Объясните, что вы пытаетесь построить? –

Смежные вопросы