数字图像可以看做$\mathbb{R}^2 \rightarrow \mathbb{R}^c$的映射,其中$c$是图像的channel数。使用信号与系统的角度来看,如果单独考察某个channel,可以将图像看做是二维离散系统。
卷积
卷积的概念不再详述,利用不同的kernel与原始图像做卷积,就是对图像进行线性滤波的过程。卷积操作时,以某一个点为中心点,最终结果是这个点以及它的邻域点的线性组合,组合系数由kernel决定。一般kernel的大小取成奇数。如下图所示。(图片来自博客《图像卷积与滤波的一些知识点》)
在卷积操作时,常常需要对图像做padding,常用的padding方法有:
- zero padding,也就是填充0值。
- edge replication,也就是复制边缘值进行填充。
- mirror extension,也就是将图像看做是周期性的,相当于使用对侧像素值进行填充。
作业1
调整图像灰度值为0到255
计算相应的k和offset值即可。另外MATLAB中的uint8
函数可以将结果削顶与截底为0到255之间。1
2
3scale_ratio = 255.0 / (max_val - min_val);
offset = -min_val * scale_ratio;
fixedimg = scale_ratio * dark + offset;
SVD图像压缩
使用SVD进行图像压缩,下图是将所有奇异值按照从大到小的顺序排列的大小示意图。可以看到,第一个奇异值比其他高出一个数量级。
MATLAB实现
分别使用10,50, 100个分量进行图像压缩,如下图所示。可以看到,k=10时,已经能够复原出原图像的大致轮廓。当k更大时,更多细节被复原出来。
MATLAB代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25%% read image
im = imread('./flower.bmp');
im_gray = double(rgb2gray(im));
[u, s, v] = svd(im_gray);
%% get sigular value
sigma = diag(s);
top_k = sigma(1:10);
figure
plot(1:length(sigma), sigma, 'r-', 'marker', 's', 'markerfacecolor', 'g');
figure
subplot(2, 2, 1);
imshow(uint8(im_gray));
title('flower.bmp')
index = 2;
for k = [10, 50, 100]
uk = u(:, 1:k);
sk = s(1:k, 1:k);
vk = v(:, 1:k);
im_rec = uk * sk * vk';
subplot(2, 2, index);
index = index + 1;
imshow(uint8(im_rec));
title(sprintf('k = %d', k));
end
图像SVD压缩中的误差分析
完全是个人随手推导,不严格的说明:
将矩阵分块。由SVD分解公式$\mathbf{U}\mathbf{\Sigma} \mathbf{V^\dagger} = \mathbf{A}$,把$\mathbf{U}$按列分块,$\mathbf{V^\dagger}$按行分块,有下式成立:
由于
所以,
上面的式子和式里面只有$r$项,是因为当$k > r$时,$\sigma_k = 0$。
所以
根绝矩阵范数的性质,我们有,
由于$u_i$和$v_i$都是标准正交基,所以范数小于1.故,
取无穷范数,可以知道对于误差矩阵中的任意元素(也就是压缩重建之后任意位置的像素灰度值之差),都有:
SVD与矩阵范数
如果某个函数$f$满足以下的性质,就可以作为矩阵的范数。
- $f(\mathbf{A}) = \mathbf{0} \Leftrightarrow \mathbf{A} = \mathbf{0}$
- $f(c\mathbf{A}) = c f(\mathbf{A}), \forall c \in \mathbb{R}$
- $f(\mathbf{A+b}) \le f(\mathbf{A}) + f(\mathbf{B})$
其中,矩阵的2范数可以定义为
其中,$x$是单位向量。上式的意义在于表明矩阵的2范数是对于所有向量,经过该矩阵线性变换后摸长最大的那个变换后向量的长度。
下面,给出不严格的说明,证明矩阵的2范数数值上等于其最大的奇异值。
对于空间内的任意单位向量$x$,利用矩阵的SVD分解,有(为了书写简单,矩阵不再单独加粗):
其中,$U^\dagger U = I$,已经被消去了。
进一步化简,我们将$V^\dagger x$看做一个整体,令$\omega = V\dagger x$,那么有,
也就是说,矩阵的2范转换为了$\Sigma \omega$的幅值的最大值。由于$\omega$是酉矩阵和一个单位向量的乘积,所以$\omega$仍然是单位阵。
由于$\Sigma$是对角阵,所以$\omega$与其相乘后,相当于每个分量分别被放大了$\sigma_i$倍。即
它的幅值平方为
当且仅当,$\omega_1 = 1$, $\omega_k = 0, k > 1$时取得等号。
综上所述,矩阵2范数的值等于其最大的奇异值。
矩阵的另一种范数定义方法Frobenius norm定义如下:
如果我们两边平方,可以得到,矩阵的F范数实际等于某个矩阵的迹,见下式:
利用矩阵的SVD分解,可以很容易得出,$\text{trace}(A^\dagger A) = \sum_{i=1}^{r}\sigma_i^2$
说明如下:
由于$V^\dagger = V^{-1}$,而且$\text{trace}(BAB^{-1}) = \text{trace}(A)$,所以,
也就是说,矩阵的F范数等于它的奇异值平方和的平方根。