LocalNormalization算法原理、实现和在视频处理中震铃效果的发现和去除


    这个名字比较长,但其实说的是一系列问题:LocalNormalization这种图像增强算法是什么?有什么用?如何实现?当这种图像算法运用到动态视频的过程中会出现什么新的问题,如何解决问题获得做好效果?
    感谢labviewpbt(imageshop作者)的指导和帮助。
    这里是博客处理图片,红外光下的手臂血管图片。

 

 

     一、LocalNormalization是什么?有什么用?(资料来自imagej)
     The local normalization tends to uniformize the mean and variance of an image around a local neighborhood. This is especially useful for correct non-uniform illumination or shading artifacts.
    Local Normalization(局部正规)定义?对于光照均衡有很好的效果。
     二、LocalNormalization如何实现?(来自stack overflow)
     LN的定义比较简单
     
     其中
  • f(x,y) is the original image
  • mf(x,y) is an estimation of a local mean of f(x,y)
  • σf(x,y) is an estimation of the local variance
  • g(x,y) is the output image
       那么如何计算图像的局部均值和局部方差了?很容易就会想到卷积的方法。具体思路可以参考上一篇博客。实际过程中采用如下方法

 

 

      由于Gaussian Smooth的速度比较慢,所以在实际过程中会使用Box Filter,基于Opencv的代码如下:
        //Local Normalization  input is 32f1u
cv::Mat LocalNormalization(cv::Mat float_gray,float sigma1,float sigma2){
    Mat gray, blur, num, den;
    float_gray.convertTo(float_gray, CV_32F, 1.0/255.0);
    // numerator = img - gauss_blur(img)
                 boxFilter(float_gray,blur,float_gray.depth(),Size(sigma1,sigma1));
    num = float_gray - blur;
    boxFilter(num.mul(num),blur,num.depth(),Size(sigma2,sigma2));
    // denominator = sqrt(gauss_blur(img^2))
    cv::pow(blur, 0.5, den);
    // output = numerator / denominator
    gray = num / den;
    // normalize output into [0,1]
    cv::normalize(gray, gray, 0.0, 1.0, NORM_MINMAX, -1);
    return gray;
}
    效果如下,可以看到原先不是很明显的血管得到了有效的增强。
      进一步可以EqualHist 、Clahe甚至Frangi,但这里不是重点。
      三、这种图像算法运用到动态视频的过程中会出现什么新的问题,如何解决这些问题。
      现在看来,一切都很美好,预期的目的也基本实现了。但是当将代码移动到视频的时候就会发现一个比较严重的问题:屏幕闪动比较厉害,造成用户体验很差。
      这个时候我在思考,如果出现这种情况,一般上是因为局部的运算造成了整体的均值的变化。本来想通过一些平滑的方法去除这个变化,但是效果都不是很好。一个偶尔的机会我采用photoshop对这个此时产生的图像进行了曲线计算。

 

 

可以发现直方图非常的窄。这个时候我想起以前在做美颜算法的时候,有一个从GIMP中挖过来的"对比度自动调节"函数。拿来使用,对於单幅图像,可以将对比度进行拉升,而且效果不错。更为关键的是对于连续的视频,很好地去除了抖动的效果。
四、小结
到目前为止,LocalNormalization这个问题算是比较好的解决了。反思解决问题的关键点,一个是平时的积累,这个包括经验的积累和资料的积累;一个是朋友和网络的支持;还有一个就是项目的拉动。总的来说,还是“产、学、研”的协力拉动,才能够产出好的产品。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章