在许多程序中,例如 https://gist.github.com/kkomakkoma/4fb21b853ce774fe5c6d47e9626e6570
以这种方式设计 gabor 滤波器:
def build_filters():
filters = []
ksize = 31
for theta in np.arange(0, np.pi, np.pi / 32):
params = {'ksize':(ksize, ksize), 'sigma':1.0, 'theta':theta, 'lambd':15.0,
'gamma':0.02, 'psi':0, 'ktype':cv2.CV_32F}
kern = cv2.getGaborKernel(**params)
kern /= 1.5*kern.sum() #why? why? why?
filters.append((kern,params))
return filters
{kern/= 1.5*kern.sum()} 是做什么的? 谢谢你的回答
最佳答案
我会尽力回答这个问题,因为我也在处理这个问题。
首先,我认为这是一个有点相关的问题: gabor edge detection with OpenCV
执行此操作会产生一种平均操作(类似于仅使用平均掩模来对图像进行卷积),因此在某种程度上它提供了一些平滑。它还用于标准化内核,如我上面的链接中所述(以防止卷积完成时某些像素的响应远远超过其他像素)。如果不这样做,那么内核的最大值有可能比最小值大几个数量级。
在使用 openCV 的 filter2D 函数之后,我在有或没有这行代码的输入图像上测试了这个,就像您发布的 github 链接中一样(输出图像缩放到 0 到 255 之间),结果是如果没有这行代码,许多像素的强度就会直接达到 255,这是预期的,因为每个像素刚刚被分配了内核的最大值。
我希望这会有所帮助...如果其他人对此有更多推理或信息,我真的很想知道!
关于python - python中关于gabor过滤器的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42381462/