图像中值滤波是一种非线性的图像平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。中值滤波能有效去除椒盐噪声,参考http://blog.csdn.net/weixin_37720172/article/details/72627543如下图
加权中值滤波是将窗口内的每一个像素都乘上一个相应的权值,然后利用乘上权值后的值进行排序,取中值替换中心元素的灰度值即可。中值滤波可以看做是每个像素的权值都是1的加权中值滤波。 加权中值滤波由于比较耗时,基本是O(r2)的复杂度,在实时性要求比较高的项目中是难以应用的,因此文章100+ Times Faster Weighted Median Filter主要就是采用了多种方法进行加速。
联合直方图 (Joint-Histogram)如上图所示,每个像素用二维元素表示(I(q),f(q)),其中,I(q)为图像灰度值,f(q)为图像某种特征(可以是灰度、颜色或者其他高级特征)。对于图像中一个r*r的局部窗口,设该窗口内有NI个像素灰度值,Nf个图像特征,利用图像灰度值i做横坐标,特征f为纵坐标,得到图中(b)的联合直方图H,该直方图的元素H(i,f)表示原来r*r的窗口内灰度为i,特征为f的像素的个数,如下式: 其中“#”表示计算符合条件的元素个数。 如图中的(c),横坐标为i,纵坐标为权值和。得到联合直方图H(i,f)后,便可以计算像素灰度为i的的权值和,如下式: 式中H(i,f)为灰度为i,特征为f的像素的个数,g(ff,f(p))为特征为f的像素与中心像素f(p)的权值。通过上式,便得到上图(c)中的第i个bin,同样的计算方法便可以得到其他灰度值的权值和,最终得到图(c).
2. 中值查找(Median Tracking) 为了查找中值,需要做两次计算:(1)对图(c)从左到右进行累加,得到所有权值和wt;(2)对图(c)从左到右进行累加,加到最接近wt/2停止,这对应的i就是中值,利用该i替换中心元素灰度值即可完成该窗口的加权中值滤波。为了对该过程进行加速,引入了以下的Cut Point and Balance。 如上图,窗口图像的权值分布在某个点i分成了左边权值和wl和右边权值和wr两个部分,且wl-wr=0。则该点就是cut point。其中wl-wr就是文章中所说的balance。cut point的求解可以通过下式得到: Median Tracking Scheme 计算出当前窗口的cut point c(p)后,为了达到进一步的加速效果,文中做了如下的操作:对于p后面的以p+1为中心的窗口,以c(p)为cut point,如果他的balance为正,则认为他的cut point 是以p为中心的窗口的cut point左移一位,即c(p)-1,如此重复直到balance为负。(Then the point before the last one is set as c(p + 1)这句话没理解.)相反,如果他的balance为负,则认为他的cut point 是以p为中心的窗口的cut point右移一位,即c(p)+1,如此重复直到balance为正。通过这种方法,中心为p的窗口附近的窗口不需要每个都计算一次权值分布,根据balance进行移动就可以啦,大大减少运算量。 Balance Computation 为了进一步加速,文中提出了balance counting box (BCB)的方法。 BCB 的计算就是联合直方图的行累加和,如上图所示,得出一个Nf*1的列矩阵。对第f行(特征为f)的BCB计算如下(式中c为cut point): 然后,便可以得出整个窗口的BCB,如下式:
3. Necklace Table 在计算联合直方图和BCB时,有90%-98%的元素为0,因此挨个计算将是极大的浪费,因此文中中引入了Necklace Table。 有以下几个有点:
O(1)的元素访问;O(1)的元素插入和删除;O(N)的遍历(N为非零元素个数)以上为本人理解,还需各位大神指正! 原文pdf、C++、Matlab代码,exe程序: http://www.cse.cuhk.edu.hk/~leojia/projects/fastwmedian/index.htm
http://blog.csdn.net/weixin_37720172/article/details/72627543
