3. 常用视频处理算法
3.1 图像的缩放
所谓图像缩放就是创立新的像素位置并对这些新位置赋灰度值。比如,有一副大小为500x500像素的图像,想把它放大1.5倍,也即750x750像素,概念上看,一种最容易的形象化放大方法就是在原始图像上,放一个虚构的750x750的栅格。很显然栅格的间隔小于1个像素,因为,我们在一个较小的图像上去拟合它。为了对覆盖层上的任何电进行灰度赋值,我们在原图像上寻找最靠近的像素并把它的灰度付给栅格上的新像素。当对覆盖栅格的全部点都赋完值之后,就得到放大的图像。这种灰度赋值方法叫最近邻放大方法。还有一种方法,就是采用4个最邻近点的双线性插值来对灰度赋值。当然还有其它多种插值方法。但最常见的就是最近邻法和双线性插值法。
下面给出双线性插值算法:
(1) 计算源图像与目标图像宽与高的比例
w0: 表示源图像的宽度
h0: 表示源图像的高度
w1 :表示目标图像的宽度
h1: 表示目标图像的高度
floatfw = float(w0-1)/(w1-1);
floatfh = float(h0-1)/(h1-1);
(2)针对目标图像的一个点(x, y),计算在源图像中的对应坐标,结果为浮点数。
floatx0 = x * fw;
floaty0 = y * fh;
intx1 = int(x0);
intx2 = x1 + 1;
inty1 = int(y0);
inty2 = y1+1;
所求的源图像中的四个点坐标为(x1, y1) (x1, y2) (x2, y1) (x2,y2)
(3)求周围四个点所占的权重比值
如上图,
fx1 = x0 - x1;
fx2 = 1.0f - fx1;
fy1 = y0 - y1;
fy2 = 1.0f - fy1;
float s1 = fx1*fy1;
float s2 = fx2*fy1;
float s3 = fx2*fy2;
float s4 = fx1*fy2;
我们以value(坐标)来代表取得此点的坐标值,则:
value(x0,y0)= value(x2,y2)*s1+value(x1,y2)*s2+value(x1,y1)*s3+value(x2,y1)*s4;
如果 对上述运算不够明白 的话,可以这样来求。
我们先要求得(x0,y1) 和(x0,y2)的像素值。
则floatvalue(x0,y1) = value(x1,y1)*fx2 + value(x2,y1)*fx1;
floatvalue(x0,y2) = value(x1,y2)*fx2 + value(x2,y2)*fx1;
注释:离某点越近,离权重越大,故取其与1的差值。
floatvalue(x0,y0) = value(x0,y1)*fy2 + value(x0,y2)*fy1;
最近邻法的需要计算2个像素之间的距离,两个像素(x,y)和(s,t)之间的距离可以有多种表示:
3.2视频降噪算法
3.2.1空域滤波
一般来说,在M X N的图像f上,用m X n大小的滤波器掩模进行线性滤波由下式给出:
这里, a = (m -1)/2,b=(n-1)/2。
x = 0,1,。。。,M-1;y = 0,1,。。。,N-1
g为滤波获得的图像。
常用模板:
空域滤波会造成图像模糊,改进方法是对灰度差值和像素距离等信息改变模板的加权系数。如双边滤波算法。
中值滤波:对模板覆盖的区域所有像素的值做排序,将处于中间的值,作为滤波输出。
3.2.2时域滤波
K与| s(x,y,t) – g(x,y,t-Tp) |有关。运动越大,k越趋向1,滤波最弱。静止图像,k = 0,滤波最强。通过检测消除运动鬼影。
3.2.3时空滤波
空域滤波只取决于单帧,虽然每一帧看起来比较干净,但是帧与帧之间看起来并不是很平静,显得噪声好像还是比较大,并且图像会模糊,主观感觉不好,对视频来说,空域滤波并不是很好。时域滤波效果较好,但是,对运动场景,时域滤波会造成鬼影。
对运动对象,人眼的分辨率极低。所以适合使用空域滤波;而对静止部分,时域滤波会保持原有图像的清晰度,且对噪声滤波最强,也不会有鬼影。所以我们可以通过运动检测,自适应选择空域滤波和时域滤波算法。
下面以DM8168的时空滤波器为例来说明:
temporal_strength:时域滤波强度。如果m大于temporal strength时,就不进行时域滤波,仅执行空域滤波。a0表示
噪声的估计是为了考虑在噪声比较小的时候,空域滤波的强度低一些,噪声比较大的时候,空域噪声的强度强一些,以避免图像因空域滤波而带来的模糊过大。噪声估计的方法是使用当前输入图像与上一输出帧Ip之间的像素差绝对值的均值来衡量。这个均值越大,说明噪声越大,否则说明噪声越下。
3.3 去隔行算法
3.3.1 概述
前面我们讨论过隔行视频在逐行显示器上显示的问题。这一节我们讨论如何解决这个问题,这就是去隔行算法,其实,这个算法我们几乎天天都能体会到,因为现在的电视机就需要解决去隔行问题。我们的电视视频大都是隔行扫描的视频,而我们的电视机却由隔行扫描的电视机演变为逐行扫描的电视机了,所以,有视频去隔行的问题。
通过下面的几张示意图,理解去隔行。
3.3.2 空域去隔行算法
(1)行复制
说明:
- 是空域位置
- 是输出“帧”, 是输入“场”,所以输出的帧频应该等于场频。
- 是在偶场的偶行,和在奇场的齐行,像素内容保持不变。
- 行数为一场行数的2倍,水平分辨率一样。
(2)线性滤波
3.3.3 时空域去隔行算法
(1)场间行平均
(2)垂直时域中值滤波:
算法多种多样,都是在去隔行效果、图像清晰度、算法复杂度、硬件复杂度等方面的一种平衡。
3.4视频增强算法
我们经常使用的视频增强算法是空间域增强,这种增强算法是对构成图像的像素直接进行操作,从而达到增强图像的目的。
一般:
g(x, y) = T[f(x, y)]
其中g(x,y)是处理后的图像,f(x, y)是输入的图像,T是对f的一种操作运算,其定义是在(x,y)的邻域。点(x,y)的邻域是以(x,y)为中心的矩形或正方形子像素。
如果T仅仅是对(x,y)处的单个像素进行操作,则称为灰度级变换。如果T是对一个(x,y)邻居区域做运算,如3x3,5x5等邻域,则称为模板滤波。
3.4.1 基本的灰度变换
(1)灰度反转(黑热白热极性反转)
也就是我们在热像仪中的黑热和白热图像。如下图:对左边白热的图做了反转变换,变换成黑热图像:
s = L – r 这里r是原像素灰度值;s是变换后的灰度值;L是最大灰度值。
显然,右边黑热图像的细节看得更清楚。
(2)伽玛校正
s = c c和 是正的常数。
显然,我们从上面我们可以看到, < 1,可拉伸亮度较低的图像,以看清昏暗部分的细节。而 > 1,可拉伸亮度较高的图像,以看清明亮部分的细节。
(3)分段线性变换函数
可用于拉伸某一灰度范围的对比度。
3.4.2 直方图均衡
(1)直方图的概念
如果对于灰度级[0,L-1]的图像,那么该图像每个灰度级的像素个数,我们称为该图像的直方图。用离散函数来表示就是:h( ,这里 是第k级灰度, 是图像中灰度级 的像素个数。我们经常以图像中像素的总数(用n表示)来除它的每一个值得到归一化的直方图。因此,一个归一化的直方图由P( 给出,这里k=0, 1 … L-1。简单地说,P( 给出了灰度级 发生的概率估计值。注意,一个归一化的直方图,其所有部分之和应等于1。
从直方图中我们就可以看出图像质量的好坏,很明显,直方图分布比较均匀的图像具有比较搞得对比度和多变的灰度色调。反过来,如果使一个直方图不太均匀的图像的直方图变得相对比较均匀,那么就可能提高该图像的质量。这就是直方图均衡图像增强算法。
(2)直方图均衡
如果一副图像中灰度级 出现的概率近似为
这其中n为图像中像素总和, 为灰度级 的像素个数,L为图像中的可能灰度级总数,可以证明变换
使得变换后的图像直方图均衡化,或直方图线性化。
3.4.3 Retinix算法
一般我们可用把一副图像看作入射光(L)和反射光(R)的乘积,L可用看做一种影响图像质量的干扰(如雾霾昏暗光线等等),而R可以看作是不含干扰的清晰图像,也就是说,获得的图像可以看成是干净的图像与噪声的乘积。
S(x,y) = R(x,y) * L(x,y) (1)
其中S为受到噪声干扰的图像,R是想获得干净的图像,L是噪声。
对(1)两边取对数可得到:
r(x,y) = s(x,y) + l(x,y)
s(x,y) = log(S(x,y); r(x,y) =log(R(x,y); l(x,y) = log(L(x,y))
因为S(x,y)已知,所以关键是如何求L(x,y)。一般我们通过对S(x,y)进行很强的滤波来获得近似的L(x,y),从而求解除R(x,y)。