【问题标题】:How to "apply" 2D gabor wavelet to an image如何将 2D gabor 小波“应用”到图像
【发布时间】:2018-07-18 13:54:15
【问题描述】:

可能重复 - How to apply Gabor wavelets to an image?

我浏览了上面链接中的答案,但我真的无法理解。第一个答案,被接受的答案,在进行逆 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()

结果图:

现在,重点是,我有视网膜的图像,特别是血管高度对比的倒置绿色通道。我必须对它进行“一些操作”,使用上述小波之一(或过滤器?请在这里纠正我过滤器和小波之间的区别)。

为了增加血管的对比度,我必须在我得到的小波和图像之间进行什么操作?:

这里也是小波绝对值的图像:

请帮我解决这个问题。几天以来,我一直被困在这里,没有通过谷歌搜索和阅读论文获得太多帮助。我是该领域的初学者。

非常感谢

【问题讨论】:

  • "在进行逆 FFT 之前,将图像的 FFT 与自身相乘" 没错,我刚刚修正了那个错字。但是看看那个答案中的第二个代码块,那是应用 Gabor 过滤器的地方。它将图像的傅里叶变换和内核的傅里叶变换相乘,并对结果进行逆变换。这也是cv2.filter2D 对较大内核所做的事情。

标签: opencv image-processing wavelet wavelet-transform gabor-filter


【解决方案1】:

您需要应用卷积。你用 Gabor 核对图像进行卷积,然后取复数结果的大小。

在 Python 中与 OpenCV 的卷积是使用 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)

Disclamer:我没有运行上面的任何代码,甚至没有安装 OpenCV。 :)

【讨论】:

    猜你喜欢
    • 2012-02-18
    • 1970-01-01
    • 2019-08-22
    • 2014-02-28
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多