Как применить двумерный вейвлет Габора к изображению

Возможный дубликат - Как применить вейвлеты Габора к изображению?

Я просмотрел ответы в приведенной выше ссылке, но я действительно не мог следовать за ней. Первый ответ, принятый, умножает БПФ изображения на себя внутри, прежде чем выполнять обратное БПФ. Это вообще не имело для меня смысла

Вот мой вопрос. Я пытаюсь воспроизвести результаты статьи «Многослойная сегментация кровеносных сосудов на основе порогового значения для скрининга диабетической ретинопатии» (http://search.proquest.com/openview/94a1d9b4eed15c442da4f8a62c82a83b/1?pq-origsite=gscholar&cbl=326339)

def gabor_wavelet(rows, cols, kmax, f, orientation, scale, delt2):

    k = (kmax / (f ** scale)) * np.exp(1j * orientation * np.pi / 8)
    kn2 = np.abs(k) ** 2

    gw = np.zeros((rows, cols), np.complex128)

    for m in range(int(-rows/2) + 1, int(rows / 2) + 1):
        for n in range(int(-cols/2) + 1, int(cols / 2) + 1):
            t1 = np.exp(-0.5 * kn2 * (m**2 + n**2) / delt2)
            t2 = np.exp(1j * (np.real(k) * m + np.imag(k) * n))
            t3 = np.exp(-0.5 * delt2)
            gw[int(m + rows/2 - 1),int(n + cols/2 - 1)] = (kn2 / delt2) * t1 * (t2 - t3)

    return gw

Для построения вейвлетов (или это фильтры?) Для масштаба = от 1 до 4 и ориентации = от 1 до 8 создаются следующие вейвлеты (построение реальной части):

R = 128
C = 128

kmax = np.pi / 2
f = np.sqrt(2)
delt2 = (2 * np.pi) ** 2
fig = plt.figure()
for v in range(1, 5):
    for u in range(1, 9):
        gw = gabor_wavelet(R, C, kmax, f, u, v, delt2)
        fig.add_subplot(4, 8, 8*(v-1) + u)
        plt.imshow(np.real(gw), cmap='gray')

plt.show()

Полученные графики: Графики вейвлета Габора

Теперь основное внимание уделяется изображению сетчатки, а именно перевернутому зеленому каналу, где кровеносные сосуды очень контрастны. Я должен выполнить "некоторую операцию" с ним, используя один из вышеперечисленных вейвлетов (или фильтров? Пожалуйста, исправьте здесь разницу между фильтром и вейвлетом).

Какую операцию я должен выполнить между полученным вейвлетом и изображением, чтобы увеличить контрастность сосудов?:

введите здесь описание изображения

Вот изображение абсолютного значения вейвлета:

введите здесь описание изображения

Пожалуйста, помогите мне с этим. Я застрял здесь на несколько дней без особой помощи от гугления и чтения статей. Я новичок в сфере.

Большое спасибо


person Sagar B Hathwar    schedule 08.02.2018    source источник
comment
умножает БПФ изображения на себя внутри, прежде чем использовать обратное БПФ. Правда, я только что исправил эту опечатку. Но посмотрите на второй блок кода в этом ответе, где применяются фильтры Габора. Он умножает преобразование Фурье изображения и преобразование Фурье ядра и выполняет обратное преобразование результата. Это также то, что cv2.filter2D делает для больших ядер.   -  person Cris Luengo    schedule 08.02.2018


Ответы (1)


Вам нужно применить свертки. Вы сворачиваете изображение с ядром Габора, затем получаете величину сложного результата.

Свертка с OpenCV в Python применяется с использованием cv2.filter2D функция. Я предполагаю, что это будет выглядеть примерно так:

gw = gabor_wavelet(R, C, kmax, f, u, v, delt2)
result = cv2.filter2D(image, CV_32F, gw)
result = np.absolute(result)

Но, возможно, OpenCV не выполняет сложные фильтры, тогда это:

gw = gabor_wavelet(R, C, kmax, f, u, v, delt2)
resultR = cv2.filter2D(image, CV_32F, np.real(gw))
resultI = cv2.filter2D(image, CV_32F, np.imag(gw))
result = np.hypot(resultR, resultI)

Отказ от ответственности: я не запускал код выше и даже не устанавливал OpenCV. :)

person Cris Luengo    schedule 08.02.2018