图像复原。
函数说明
Mat 构造函数
|
|
Mat 值拷贝
|
|
Mat 截取
|
|
ranges - 每个维度选取的范围构成的数组
Sum / Mean
返回数组元素的和,对于每个通道独立。
divide
两个数组间元素的除法。
参数说明
- src1 - 第一个输入数组
- src2 - 第二个输入数组
- dst - 输出数组,与输入数组具有相同的大小和类型
- scale - 可选的比例参数
- $dst = (scale \cdot src1) / src2$
- dtype - 可选的输出数组深度;若为-1,则输出数组深度为
src2.depth()
,但为了防止数组除法(array-by-array division)的情况,当src1.depth()==src2.depth
时,只能设定-1.
函数说明
- 当
src2(I)
为0时,dst(I)
也为0 - 多通道数组的各不同通道独立计算
问题描述
复原椒盐噪声图像
原图像如下图所示。向其中加入椒盐噪声,并采用
- 算术均值滤波
- 几何均值滤波
- 谐波均值滤波
- 中值滤波
过滤噪声,复原图像。
点此下载
复原运动模糊图像
运动模糊图像如下图所示。采用维纳滤波进行图像复原。
点此下载
程序实现
加入椒盐噪声
设加入噪声的比例为p。在每个像素位置,生成 [0,1) 的随机数,当随机数值小于0.5p时,加入胡椒噪声;当随机数值在 [0.5p, p) 范围内时,加入盐噪声。
|
|
加入椒盐噪声后的图像:
边界扩展
为了便于边界点的模板操作,对原图的边界进行扩展。目标图像上的像素坐标在扩展图像上对应于窗口区域的左上角位置。补0扩展在滤波操作中会显著减小边界点的灰度值,这里采用反射扩展。
|
|
椒盐噪声滤波
算术均值滤波
令$S_{xy}$表示中心在$(x,y)$,尺寸为$m\times n$的矩形子图像窗口的坐标集。算术均值滤波可表示为:
$$\hat f(x,y)=\frac{1}{mn}\sum_{(s,t)\in S_{xy}}{g(x,y)}$$
|
|
几何均值滤波
每个被复原像素由子图像窗口中像素点的乘积结果求$\frac{1}{mn}$次幂得到:
$$\hat f(x,y)=\left(\prod_{(s,t)\in S_{xy}}{g(x,y)} \right) ^{\frac{1}{mn}}$$
|
|
可以看出,几何均值滤波不能过滤胡椒噪声,反而会扩大胡椒噪声。由几何均值滤波公式,当窗口区域中有像素点的灰度值为0时,计算得到的几何均值就为0。即几何均值滤波后,胡椒噪声周围的像素点都将变为黑点。
考虑到几何均值滤波可以过滤盐噪声,可对图像中的胡椒噪声取反,变为盐噪声,再进行滤波。
加入一行代码:
对胡椒噪声取反后,几何均值滤波得到的图像:
谐波均值滤波
谐波均值滤波可表示为:
$$\hat f(x,y)=\frac{mn}{\sum \limits_{(s,t)\in S_{xy}}{\frac{1}{g(x,y)}}}$$
|
|
同几何均值滤波类似,谐波均值滤波也不能过滤胡椒噪声。由谐波均值滤波公式,当窗口区域中有像素点的灰度值为0时,分母为无穷大,计算得到的谐波均值为0。即谐波均值滤波后,胡椒噪声周围的像素点都将变为黑点。
同样的,对图像中的胡椒噪声取反,变为盐噪声,再进行滤波。滤波得到的图像:
中值滤波
取子图像窗口中像素点灰度的中值作为被复原像素点的灰度值:
$$\hat f(x,y)=\mathop{medium}\limits_{(s,t)\in S_{xy}}{g(x,y)}$$
首先考虑通过对窗口区域像素的灰度值进行排序来计算中值。对于大小为 $n\times n$ 的模板核,冒泡排序的时间复杂度为$O(n^4)$,快速排序的时间复杂度为$O(n^2\log n)$。显然对于较大的模板核,计算时间很长。
论文《AFast Two-Dimensional Median Filtering Algorithm》[1] 中提出了一种时间复杂度为$O(n)$的中值计算方法。
利用灰度直方图计算中值
利用窗口区域的灰度直方图计算其像素点中值,对于深度一定的图像,计算时间为常数,即复杂度为$O(1)$。
|
|
计算灰度直方图
在每一行的起始,计算窗口区域的灰度直方图,在从一个像素点移动到与之相邻(水平或垂直方向)的像素点时,动态地更新灰度直方图。如下图所示。对于 $n\times n$ 的窗口区域,每次移动在直方图中执行n次减法与n次加法,时间复杂度为$O(n)$。
[2]
|
|
运动模糊图像复原
运动模糊的退化函数
假设图像以一定的速率做匀速直线运动,x, y 方向上的速度分别为 $x_0(t)=\frac{at}{T}$,$y_0(t)=\frac{bt}{T}$ 。运动模糊的退化函数可表示为
$$H(u,v)=\frac{T}{\pi (ua+vb)}\sin\left[\pi (ua+vb)\right]e^{-j\pi (ua+vb)}=\frac{T}{\pi (ua+vb)}\sin\left[\pi (ua+vb)\right](\cos\left[\pi (ua+vb)\right]-j\sin\left[\pi (ua+vb)\right])=T\frac{\sin\left[2\pi (ua+vb)\right]}{2\pi (ua+vb)}+jT\frac{\cos\left[2\pi (ua+vb)\right]-1}{2\pi (ua+vb)}$$
|
|
维纳滤波
维纳滤波可近似表示为
$$\hat F(u,v)=\left[\frac{1}{H(u,v)}\frac{|H(u,v)|^2}{|H(u,v)|^2+K}\right]G(u,v)$$
其中,K 为信噪比。
设$G(u,v)=a_1+jb_1$,$H(u,v)=a_2+jb_2$。则上述公式可化为:
$$\hat F(u,v)=\frac{a_1+jb_1}{a_2+jb_2}\cdot\frac{|H(u,v)|^2}{|H(u,v)|^2+K}=\frac{(a_1+jb_1)(a_2-jb_2)}{(a_2+jb_2)(a_2-jb_2)}\cdot\frac{|H(u,v)|^2}{|H(u,v)|^2+K}=\frac{(a_1a_2+b_1b_2)+j(a_2b_1-a_1b_2)}{(a_2^2+b_2^2)+K}$$
|
|
图像复原
对模糊图像进行傅里叶变换,采用变换得到的频谱与估计的退化函数进行维纳滤波,再对滤波后的频谱进行傅里叶反变换,得到复原图像。
|
|
在当前设置的退化函数参数下,去模糊的效果不明显,同时有一定的颜色失真。
Matlab 复原
Matlab 下调用函数进行图像复原:
|
|
得到的复原图像:
参考文献
[1] Huang T, Yang G,Tang G. A fast two-dimensional median filtering algorithm[J]. IEEE Transactionson Acoustics, Speech, and Signal Processing, 1979, 27(1): 13-18.
[2] Perreault S, Hébert P. Medianfiltering in constant time[J]. IEEE transactions on image processing, 2007,16(9): 2389-2394.