我正在阅读这篇论文"自反2D Log-Gabor小波",它将2D log gabor滤波器定义为:
该论文还指出,该滤波器仅覆盖频率空间的一侧,并在此图像中显示。 在我尝试实现筛选器时,我得到的结果与论文中所述的不符。让我先介绍我的实现,然后再说明问题。实现:
I created a 2d array that contains the filter and transformed each index so that the origin of the frequency domain is at the center of the array with positive x-axis going right and positive y-axis going up.
number_scales = 5 # scale resolution number_orientations = 9 # orientation resolution N = constantDim # image dimensions def getLogGaborKernal(scale, angle, logfun=math.log2, norm = True): # setup up filter configuration center_scale = logfun(N) - scale center_angle = ((np.pi/number_orientations) * angle) if (scale % 2) \ else ((np.pi/number_orientations) * (angle+0.5)) scale_bandwidth = 0.996 * math.sqrt(2/3) angle_bandwidth = 0.996 * (1/math.sqrt(2)) * (np.pi/number_orientations) # 2d array that will hold the filter kernel = np.zeros((N, N)) # get the center of the 2d array so we can shift origin middle = math.ceil((N/2)+0.1)-1 # calculate the filter for x in range(0,constantDim): for y in range(0,constantDim): # get the transformed x and y where origin is at center # and positive x-axis goes right while positive y-axis goes up x_t, y_t = (x-middle),-(y-middle) # calculate the filter value at given index kernel[y,x] = logGaborValue(x_t,y_t,center_scale,center_angle, scale_bandwidth, angle_bandwidth,logfun) # normalize the filter energy if norm: Kernel = kernel / np.sum(kernel**2) return kernel
To calculate the filter value at each index another transform is made where we go to the log-polar space
def logGaborValue(x,y,center_scale,center_angle,scale_bandwidth, angle_bandwidth, logfun): # transform to polar coordinates raw, theta = getPolar(x,y) # if we are at the center, return 0 as in the log space # zero is not defined if raw == 0: return 0 # go to log polar coordinates raw = logfun(raw) # calculate (theta-center_theta), we calculate cos(theta-center_theta) # and sin(theta-center_theta) then use atan to get the required value, # this way we can eliminate the angular distance wrap around problem costheta, sintheta = math.cos(theta), math.sin(theta) ds = sintheta * math.cos(center_angle) - costheta * math.sin(center_angle) dc = costheta * math.cos(center_angle) + sintheta * math.sin(center_angle) dtheta = math.atan2(ds,dc) # final value, multiply the radial component by the angular one return math.exp(-0.5 * ((raw-center_scale) / scale_bandwidth)**2) * \ math.exp(-0.5 * (dtheta/angle_bandwidth)**2)
Problems:
角度:论文指出,将角度从1->8进行索引会产生良好的方向覆盖,但是在我的实现中,从1->n的角度并没有覆盖全部方向,甚至垂直方向也没有被正确覆盖。可以通过以下图示来展示:该图包含了尺度为3且方向从1->8的一组滤波器。
覆盖率:通过上面的滤波器可知滤波器覆盖了空间的两侧,这与论文所说的不同。这可以通过使用从 -4 -> 4 的9个方向来更明确地表示。下面的图像包含了所有滤波器的一个图像,以展示它如何涵盖频谱的两侧(此图像是通过从所有滤波器的各个位置取最大值来创建的):
中间列(方向 $\pi / 2$):在第一幅图中,从3->8的方向可以看到滤波器在方向 $\pi / 2$处消失。这正常吗?当我将所有滤波器(所有5个尺度和9个方向)合并到一个图像中时,也可以看到这一点:
更新: 在空间域中添加了滤波器的脉冲响应,如您所见,在-4和4个方向上存在明显的失真: