Вычисление энтропии из 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 (функция текстуры)?
если нет, то какое право способ извлечения всех текстурных объектов из изображения?
Примечания: я уже упоминал:
2 ответов
является ли вычисленная энтропия из изображения серой шкалы (напрямую) такой же, как функция энтропии, извлеченная из GLCM (функция текстуры)?
нет, эти две энтропии довольно разные:
-
skimage.filters.rank.entropy(grayImg, disk(5))
дает массив того же размера, что иgrayImg
который содержит локальную энтропию по изображению, вычисленному на круговом диске с центром в соответствующем пикселе и радиусом 5 пикселей. Взгляните на энтропия (информация теория) чтобы узнать, как вычисляется энтропия. Значения в этом массиве полезны для сегментации (follow этой ссылке чтобы увидеть пример обнаружения объектов на основе энтропии). Если ваша цель-описать энтропию изображения через одно (скалярное) значение, вы можете использоватьskimage.measure.shannon_entropy(grayImg)
. Эта функция в основном применяет следующую формулу к полному изображению:
где количество уровней серого (256 для 8-битных изображений), вероятность пикселя, имеющего серый уровень и является основой функции логарифма. Когда установлено значение 2 возвращаемое значение измеряется в bits. - матрица co-occurence серого уровня (GLCM)-это гистограмма одновременных значений оттенков серого при заданном смещении по изображению. Для описания текстуры изображения его обычно извлекают характеристики как энтропия, энергия, контраст, корреляция, etc. из нескольких матриц совместного вхождения, вычисленных для разных смещений. В этом случае энтропия определяется следующим образом:
где и снова количество серых уровней и основание функции логарифма, соответственно, и означает вероятность того, что два пикселя, разделенные указанным смещением, будут иметь интенсивность и . К сожалению энтропия не является одним из свойств 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 GLCM) и вектор функции размерности . Вот код:
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])
результаты, полученные с помощью этого изображения:
:
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()