在许多程序中,例如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()}做什么? 谢谢你的回复
答案 0 :(得分:1)
我会尽力回答这个问题,因为我也在处理这个问题。
首先,我认为这是一个有点相关的问题: gabor edge detection with OpenCV
执行此操作会导致一种平均操作(类似于仅使用平均掩码来卷积图像),因此在某种程度上它提供了一些平滑。它也用于规范化内核,如上面的链接中所述(为了防止某些像素在卷积完成时远远超过其他像素的响应)。如果没有完成,那么内核的最大值可能比最小值大几个数量级。
在使用openCV的filter2D函数之后,在使用和不使用这行代码的输入图像上测试了这个,就像你发布的github链接一样(输出图像缩放到0到255之间),结果是如果没有这行代码,许多像素只能拍摄到255的强度,这是预期的,因为每个像素都被分配了内核的最大值。
我希望这有帮助......如果其他人有更多的推理或信息,我真的很想知道!