Как передать HH-поддиапазон изображения функции greycomatrix? - PullRequest
1 голос
/ 11 марта 2019

Я использую функцию scikit-images greycomatrix, которую я хочу предоставить в качестве входных данных одного из компонентов, полученных в результате вейвлет-преобразования после фильтрации по Хаару.

import pywt
import cv2
from skimage.feature import greycomatrix

original = cv2.imread('img.jpg', cv2.IMREAD_GRAYSCALE)
coeffs2 = pywt.dwt2(original, 'haar')
LL, (LH, HL, HH) = coeffs2
cv2.imshow('image', HH)
gCoMat = greycomatrix(HH, [2], [0], 256, symmetric=True, normed=True)

Если я передаю HH greycomatrix, я получаю эту ошибку:

ValueError: плавающие изображения не поддерживаются greycomatrix. Преобразовать изображение в целочисленный тип без знака.

Я попытался преобразовать изображение, используя этот код:

from skimage import util

im = util.img_as_ubyte(HH)
im /= 32
gCoMat = greycomatrix(im, [2], [0], 256, symmetric=True, normed=True)

Но я получил эту ошибку:

повышение ValueError («Изображения типа float должны быть между -1 и 1.») ValueError: Изображения типа float должны быть в диапазоне от -1 до 1.

1 Ответ

0 голосов
/ 12 марта 2019

Необходимо преобразовать интенсивность в диапазон [0, 1] перед преобразованием изображения в 8-разрядное целое число без знака:

from skimage import util, exposure, data
import pywt
from skimage.feature import greycomatrix

original = data.camera()
LL, (LH, HL, HH) = pywt.dwt2(original, 'haar')
HH_scaled = exposure.rescale_intensity(HH, out_range=(0, 1))

bin_width = 32
im = util.img_as_ubyte(HH_scaled)
im_binned = im//bin_width

gCoMat = greycomatrix(im_binned, distances=[2], angles=[0], 
                      levels=256//bin_width, symmetric=True, normed=True)

Обратите внимание, что если изображение, переданное в graycomatrix, является двоичным, параметр levels не должен быть 256, вы должны разделить это значение на тот же коэффициент (32 в вашем коде). Также важно отметить, что биннинг по интенсивности должен выполняться через целочисленное деление (//), иначе dtype из im_binned будет float. В качестве последнего предупреждения вы должны передать as_gray=True в функцию io.imread, в противном случае вы получите следующую ошибку при попытке вычислить матрицу совпадений уровня серого:

ValueError: параметр image должен быть двумерным массивом

...