这个名字比较长,但其实说的是一系列问题: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这个问题算是比较好的解决了。反思解决问题的关键点,一个是平时的积累,这个包括经验的积累和资料的积累;一个是朋友和网络的支持;还有一个就是项目的拉动。总的来说,还是“产、学、研”的协力拉动,才能够产出好的产品。 标签:中震铃,gray,LocalNormalization,float,算法,num,blur,去除 From: https://www.cnblogs.com/jsxyhelu/p/16998753.html