我正在尝试理解创建steerable pyramid时使用的代码段的作用:
th1[np.where(self.AT[i] - k*np.pi/self.K < -np.pi)] += 2.*np.pi
th1[np.where(self.AT[i] - k*np.pi/self.K > np.pi)] -= 2.*np.pi
ind_ = np.where(np.absolute(th1 - k*np.pi/self.K) <= np.pi/2.)
fil_[ind_] = self.ALPHAK * (np.cos(th1[ind_] - k*np.pi/self.K))**(self.K-1)
(第267-270行https://github.com/TetsuyaOdaka/SteerablePyramid/blob/master/steerable_pyramid.py中的完整代码)
我知道它创建了半个遮罩来构造方向滤波器,但由于第一行并没有旋转所有网格点,只是部分网格点,分成两组,然后使用索引来创建类似遮罩的圆的一部分,但显然在某种程度上遵守了径向和角度分解(https://www.cns.nyu.edu/pub/eero/simoncelli95b.pdf)所需的约束
但我很难理解这到底是怎么回事。有人能帮我解释一下这些台词吗
self.AT
是网格中已从笛卡尔坐标系转换为极坐标系的角度k
是旋转的分子(基本方向)self.K
是分母(圆圈被切割成多少部分)
ALPHAK
是标准化因子(尽管我无法理解其背后的原因)(算法似乎从这里获取了一切http://www.ipol.im/pub/art/2014/79/article.pdf)
您在极坐标系中工作,其角度介于(-pi,pi)之间。极坐标不是唯一的贴图,如果将其添加到2*pi,则每个角度都是相同的
这意味着角度大于pi或小于-pi的点需要映射到(-pi,pi)
通过测量距离
self.AT[i] - k * np.pi/self.K
,可以找到靠近方向k * np.pi/self.K
的点但是具有
self.AT[i] - k*np.pi/self.K < -np.pi
或self.AT[i] - k * np.pi/self.K > np.pi
的点将无法正确映射到范围(-pi,pi)因此,前两行仅用于通过将点重新映射回(-pi,pi)来纠正映射,因此当您在第三行中使用条件
np.where(np.absolute(th1 - k*np.pi/self.K) <= np.pi/2
时,所有角度都将正确映射行
ind_ = np.where(np.absolute(th1 - k*np.pi/self.K) <= np.pi/2.)
只是得到了距离k*np.pi/self.k方向pi/2的所有点的索引最后一行是计算这些点的过滤器值
相关问题 更多 >
编程相关推荐