Как "применить" 2D-вейвлет Габора к изображению
Возможный дубликат - Как применить вейвлеты Габора к изображению?
Я просмотрел ответы в приведенной выше ссылке, но действительно не мог перейти по ней. Первый ответ, принятый, умножает FFT изображения на себя, прежде чем брать обратное FFT. Это не имеет смысла для меня вообще
Вот мой вопрос Я пытаюсь воспроизвести результаты статьи "Многослойная сегментация кровеносных сосудов на основе трезолдинга для скрининга диабетической ретинопатии" ( 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()
Теперь основное внимание уделяется изображению сетчатки, в частности перевернутого зеленого канала, где кровеносные сосуды сильно контрастируют. Я должен сделать "некоторую операцию" над ним, используя один из вышеуказанных вейвлетов (или фильтров? Пожалуйста, исправьте здесь разницу между фильтром и вейвлетом).
Какую операцию я должен выполнить между полученным вейвлетом и изображением, чтобы увеличить контраст сосудов?:
Вот изображение абсолютного значения вейвлета тоже:
Пожалуйста, помогите мне с этим. Я застрял здесь на несколько дней без особой помощи от поиска в Google и чтения газет. Я новичок в этой области.
большое спасибо
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.:)