Z =imlincomb(A,X,B,Y,C)% Z = A*X+B*Y+C
Z =imlincomb(A,X,C)% Z = A*X+C
Z =imlincomb(A,X,B,Y)% Z = A*X+B*Y
图像的几何变换
图像平移
假设图中一点为
f
(
x
0
,
y
0
)
f(x_0,y_0)
f(x0,y0), 对其水平平移tx个单位,垂直平移ty个单位,那么用矩阵表示应该为:
[
x
1
y
1
1
]
=
[
1
0
t
x
0
1
t
y
0
0
1
]
[
x
0
y
0
1
]
\begin{bmatrix} x_1\\ y_1 \\ 1 \end{bmatrix} = \begin{bmatrix} 1&0&tx\\ 0&1&ty \\ 0&0&1 \end{bmatrix}\begin{bmatrix} x_0\\ y_0 \\ 1 \end{bmatrix}
x1y11=100010txty1x0y01 matlab中并没有提供平移图像的函数,但是可以通过膨胀函数平移图像。
应用示例
close all;clc;clear;
I =imread('example2.jpg');subplot(1,2,1),imshow(I);title("original 1");
se =translate(strel(1),[50,100]);% 将一个平面结构元素向下移动50,向右边移动100
X =imdilate(I,se);%利用膨胀平移图像subplot(1,2,2),imshow(X);title("now img");
图片镜像
设图像矩阵为
(
M
,
N
)
(M,N)
(M,N) 。
图像镜像分为垂直镜像和水平镜像。
垂直镜像:
x
1
=
M
−
x
0
y
1
=
y
0
\begin{split} & x_1 = M-x_0 \\ & y_1 = y_0 \end{split}
x1=M−x0y1=y0 水平镜像:
x
1
=
x
0
y
1
=
N
−
y
0
\begin{split} & x_1 = x_0 \\ & y_1 = N-y_0 \end{split}
x1=x0y1=N−y0 应用示例
函数
X =flip(I,dim = _)% dim = 1 水平镜像(翻转列)% dim = 2 垂直镜像(翻转行)% dim = 3 翻转第三维,可能是颜色?
close all;clc;clear;
I =imread('example2.jpg');subplot(2,2,1),imshow(I);title("original");
X_1 =flip(I,1);% 翻转行
X_2 =flip(I,2);% 翻转列
X_3 =flip(I,3);% 翻转第三维subplot(2,2,2),imshow(X_1);title("水平镜像");subplot(2,2,3),imshow(X_2);title("垂直镜像");subplot(2,2,4),imshow(X_3);title("?");
图片转置
设
(
x
0
,
y
0
)
(x_0,y_0)
(x0,y0)是原图上的点,则转置为:
x
1
=
y
0
y
1
=
x
0
\begin{split} & x_1 = y_0 \\ & y_1 = x_0 \end{split}
x1=y0y1=x0 表示为矩阵形式:
[
x
1
y
1
1
]
=
[
0
1
0
1
0
0
0
0
1
]
[
y
0
x
0
1
]
=
[
x
0
y
0
1
]
\begin{bmatrix}x_1&y_1&1\end{bmatrix}=\begin{bmatrix}0&1&0\\1&0&0\\0&0&1\end{bmatrix}\begin{bmatrix}y_0&x_0&1\end{bmatrix} = \begin{bmatrix}x_0&y_0&1\end{bmatrix}
[x1y11]=010100001[y0x01]=[x0y01]
注意:转置后图像的高度和宽度也会发生变化。
示例
matlab中需要构建转换矩阵,然后用imwarp变换图像。
close all;clc;clear;
I =imread('example2.jpg');subplot(1,2,1),imshow(I);title("original");
T=affine2d([010;100;001]);%构造空间变换结构T.这里为转置变换矩阵
X=imwarp(I,T);% 根据位移场变换图像。subplot(1,2,2),imshow(X);title("now");
图像旋转
设点
(
x
0
,
y
0
)
(x_0,y_0)
(x0,y0)经过旋转
θ
\theta
θ 角度后,坐标变为
(
x
1
,
y
1
)
(x_1,y_1)
(x1,y1)。
旋转前:
{
x
0
=
r
c
o
s
θ
y
0
=
r
s
i
n
θ
\left\{ \begin{aligned} x_0 = rcos\theta\\ y_0 = rsin\theta\\ \end{aligned} \right.
{x0=rcosθy0=rsinθ 旋转后:
{
x
1
=
r
c
o
s
(
α
−
θ
)
=
r
c
o
s
α
c
o
s
θ
+
r
s
i
n
α
s
i
n
θ
=
x
0
c
o
s
θ
+
y
0
s
i
n
θ
y
1
=
r
s
i
n
(
α
−
θ
)
=
r
s
i
n
α
c
o
s
θ
−
r
c
o
s
α
s
i
n
θ
=
−
x
0
s
i
n
θ
+
y
0
c
o
s
θ
\left\{ \begin{aligned} x_1 = rcos(\alpha-\theta) = rcos\alpha cos\theta + rsin\alpha sin\theta = x_0cos\theta+y_0sin\theta\\ y_1 = rsin(\alpha-\theta) = rsin\alpha cos\theta - rcos\alpha sin\theta = -x_0sin\theta+y_0cos\theta\\ \end{aligned} \right.
{x1=rcos(α−θ)=rcosαcosθ+rsinαsinθ=x0cosθ+y0sinθy1=rsin(α−θ)=rsinαcosθ−rcosαsinθ=−x0sinθ+y0cosθ 矩阵形式:
[
x
1
y
1
1
]
=
[
c
o
s
θ
s
i
n
θ
0
−
s
i
n
θ
c
o
s
θ
0
0
0
1
]
[
x
0
y
0
1
]
\begin{bmatrix}x_1\\y_1\\1\end{bmatrix}=\begin{bmatrix}cos\theta&sin\theta&0\\-sin\theta&cos\theta&0\\0&0&1\end{bmatrix}\begin{bmatrix}x_0\\y_0\\1\end{bmatrix}
x1y11=cosθ−sinθ0sinθcosθ0001x0y01 对矩阵求逆可得逆变换:
[
x
0
y
0
1
]
=
[
c
o
s
θ
−
s
i
n
θ
0
s
i
n
θ
c
o
s
θ
0
0
0
1
]
[
x
1
y
1
1
]
\begin{bmatrix}x_0\\y_0\\1\end{bmatrix}=\begin{bmatrix}cos\theta&-sin\theta&0\\sin\theta&cos\theta&0\\0&0&1\end{bmatrix}\begin{bmatrix}x_1\\y_1\\1\end{bmatrix}
x0y01=cosθsinθ0−sinθcosθ0001x1y11 示例
函数:
X =imrotate(A,angle)
X =imrotate(A,angle,method)
X =imrotate(A,angle,method,bbox)
close all;clc;clear;
I =imread('example2.jpg');subplot(2,2,1),imshow(I);title("original");
X_1 =imrotate(I,45);subplot(2,2,2),imshow(X_1);title("angle 45");
X_2 =imrotate(I,45,'bicubic');subplot(2,2,3),imshow(X_2);title("angle 45 bicubic");
X_3 =imrotate(I,45,'bicubic','crop');subplot(2,2,4),imshow(X_3);title("angle 45 bicubic crop");
图像缩放
将放大或者缩小后的图像将其的坐标(长宽)拉伸或者压缩到和原图一样大时,其像素坐标点对应在原图上的位置就是其映射位置。假设图像x轴方向缩放比为
f
x
f_x
fx,y轴方向缩放比为
f
y
f_y
fy ,则原图中的点
(
x
0
,
y
0
)
(x_0,y_0)
(x0,y0)缩放后对应的新位置为:
[
x
1
y
1
1
]
=
[
f
x
0
0
0
f
y
0
0
0
1
]
[
x
0
y
0
1
]
\begin{bmatrix}x_1\\y_1\\1\end{bmatrix}=\begin{bmatrix}f_x&0&0\\0&f_y&0\\0&0&1\end{bmatrix}\begin{bmatrix}x_0\\y_0\\1\end{bmatrix}
x1y11=fx000fy0001x0y01
close all;clc;clear;
I =imread('example2.jpg');figure();imshow(I);title("original");
X_1 =imresize(I,[NaN,100],'box');figure();imshow(X_1);title("[mrows ncols],box");
X_2 =imresize(I,0.5);figure();imshow(X_2);title("m");[X,map]=rgb2ind(I,16);[X_3,newmap]=imresize(X,map,1.3);figure();imshow(X_3,newmap);title("index img");
公式:
s
r
c
x
=
d
e
s
x
×
(
s
r
c
w
/
d
e
s
w
)
s
r
c
y
=
d
e
s
y
×
(
s
r
c
h
/
d
e
s
h
)
\begin{split} & src_x = des_x\times(src_w/des_w) \\ & src_y = des_y\times(src_h/des_h) \end{split}
srcx=desx×(srcw/desw)srcy=desy×(srch/desh) 此公式是四舍五入的规则。其中:
已知中P1点和P2点,坐标分别为
(
x
1
,
y
1
)
(x1,y1)
(x1,y1)、
(
x
2
,
y
2
)
(x2,y2)
(x2,y2),要计算 $[x1,x2] $区间内某一位置 x 在直线上的y值。
看图就知道了,实际上单线型插值就是建立(线性)函数,然后找x对应的
f
(
x
)
f(x)
f(x)即可。
根据两点求一条直线公式:
y
−
y
1
x
−
x
1
=
y
2
−
y
1
x
2
−
x
1
\frac{y-y_1}{x-x_1} = \frac{y_2-y_1}{x_2-x_1}
x−x1y−y1=x2−x1y2−y1 整理:
y
=
x
2
−
x
x
2
−
x
1
y
1
+
x
−
x
1
x
2
−
x
1
y
2
y = \frac{x_2-x}{x_2-x_1}y_1+\frac{x-x_1}{x_2-x_1}y_2
y=x2−x1x2−xy1+x2−x1x−x1y2 上述是对于一维(图像)而言,x即像素点位,y为像素值。为了便于后续理解,将y改写为
f
(
x
)
f(x)
f(x) 。右式
f
(
x
i
)
f(x_i)
f(xi)前的系数改称为权重。
f
(
x
)
=
x
2
−
x
x
2
−
x
1
f
(
x
1
)
+
x
−
x
1
x
2
−
x
1
f
(
x
2
)
f(x) = \frac{x_2-x}{x_2-x_1}f(x_1)+\frac{x-x_1}{x_2-x_1}f(x_2)
f(x)=x2−x1x2−xf(x1)+x2−x1x−x1f(x2) 现在将一维图像拓展为二维图像。
双线性插值
已知四个点
Q
11
(
x
1
,
y
1
)
,
Q
12
(
x
1
,
y
2
)
,
Q
21
(
x
2
,
y
1
)
,
Q
22
(
x
2
,
y
2
)
Q_{11}(x_1,y_1),Q_{12}(x_1,y_2),Q_{21}(x_2,y_1),Q_{22}(x_2,y_2)
Q11(x1,y1),Q12(x1,y2),Q21(x2,y1),Q22(x2,y2)。根据该求点
P
(
x
,
y
)
P(x,y)
P(x,y) 的像素值。
双线性插值是分别在两个方向计算了共3次单线性插值:在x方向求2次单线性插值,获得
R
1
(
x
,
y
1
)
R1(x, y_1)
R1(x,y1)、
R
2
(
x
,
y
2
)
R2(x, y_2)
R2(x,y2)两个临时点,再在y方向计算1次单线性插值得出
P
(
x
,
y
)
P(x, y)
P(x,y)。
第一步:
f
(
R
1
)
=
x
2
−
x
x
2
−
x
1
f
(
Q
11
)
+
x
−
x
1
x
2
−
x
1
f
(
Q
21
)
f
(
R
2
)
=
x
2
−
x
x
2
−
x
1
f
(
Q
12
)
+
x
−
x
1
x
2
−
x
1
f
(
Q
22
)
\begin{split} & f(R_1) = \frac{x_2-x}{x_2-x_1}f(Q_{11})+\frac{x-x_1}{x_2-x_1}f(Q_{21}) \\ & f(R_2) = \frac{x_2-x}{x_2-x_1}f(Q_{12})+\frac{x-x_1}{x_2-x_1}f(Q_{22}) \end{split}
f(R1)=x2−x1x2−xf(Q11)+x2−x1x−x1f(Q21)f(R2)=x2−x1x2−xf(Q12)+x2−x1x−x1f(Q22)
为什么权值计算没有涉及y轴?
因为y轴没变,所以权值仅取决于x轴。在接下来的第二步中也是同样的道理,x轴没变,权值仅取决于y轴。
第二步:
f
(
P
)
=
y
2
−
y
y
2
−
y
1
f
(
R
1
)
+
y
−
y
1
y
2
−
y
1
f
(
R
2
)
f(P) = \frac{y_2-y}{y_2-y_1}f(R_1)+\frac{y-y_1}{y_2-y_1}f(R_2)
f(P)=y2−y1y2−yf(R1)+y2−y1y−y1f(R2) 先暂时不联立第一步和第二步,我们先想想已知四个点的关系。我们进行插值时,找的四个点应该是靠在一起的,所以有:
x
2
−
x
1
=
1
y
2
−
y
1
=
1
\begin{split} & x_2-x_1 = 1 \\ & y_2-y_1 = 1 \end{split}
x2−x1=1y2−y1=1 化简
第一步:
f
(
R
1
)
=
(
x
2
−
x
)
f
(
Q
11
)
+
(
x
−
x
1
)
f
(
Q
21
)
f
(
R
2
)
=
(
x
2
−
x
)
f
(
Q
12
)
+
(
x
−
x
1
)
f
(
Q
22
)
\begin{split} & f(R_1) = (x_2-x)f(Q_{11})+{(x-x_1)}f(Q_{21}) \\ & f(R_2) = {(x_2-x)}f(Q_{12})+{(x-x_1)}f(Q_{22}) \end{split}
f(R1)=(x2−x)f(Q11)+(x−x1)f(Q21)f(R2)=(x2−x)f(Q12)+(x−x1)f(Q22) 第二步:
f
(
P
)
=
(
y
2
−
y
)
f
(
R
1
)
+
(
y
−
y
1
)
f
(
R
2
)
f(P) = (y_2-y)f(R_1)+(y-y_1)f(R_2)
f(P)=(y2−y)f(R1)+(y−y1)f(R2) 联立第一步和第二步:
f
(
P
)
=
(
y
2
−
y
)
f
(
R
1
)
+
(
y
−
y
1
)
f
(
R
2
)
=
(
y
2
−
y
)
[
(
x
2
−
x
)
f
(
x
1
,
y
1
)
+
(
x
−
x
1
)
f
(
x
2
,
y
1
)
]
+
(
y
−
y
1
)
[
(
x
2
−
x
)
f
(
x
1
,
y
2
)
+
(
x
−
x
1
)
f
(
x
2
,
y
2
)
]
=
(
y
2
−
y
)
(
x
2
−
x
)
f
(
x
1
,
y
1
)
+
(
y
2
−
y
)
(
x
−
x
1
)
f
(
x
2
,
y
1
)
+
(
y
−
y
1
)
(
x
2
−
x
)
f
(
x
1
,
y
2
)
+
(
y
−
y
1
)
(
x
−
x
1
)
f
(
x
2
,
y
2
)
=
(
y
2
−
y
)
(
x
2
−
x
)
f
(
Q
11
)
+
(
y
2
−
y
)
(
x
−
x
1
)
f
(
Q
21
)
+
(
y
−
y
1
)
(
x
2
−
x
)
f
(
Q
12
)
+
(
y
−
y
1
)
(
x
−
x
1
)
f
(
Q
22
)
\begin{split} f(P) & = (y_2-y)f(R_1)+(y-y_1)f(R_2) \\ & = (y_2-y)[(x_2-x)f(x_1,y_1)+(x-x_1)f(x_2,y_1)]+(y-y_1)[{(x_2-x)}f(x_1,y_2)+{(x-x_1)}f(x_2,y_2)] \\ & = (y_2-y)(x_2-x)f(x_1,y_1)+(y_2-y)(x-x_1)f(x_2,y_1)+(y-y_1)(x_2-x)f(x_1,y_2)+(y-y_1)(x-x_1)f(x_2,y_2) \\ & = (y_2-y)(x_2-x)f(Q_{11})+(y_2-y)(x-x_1)f(Q_{21})+(y-y_1)(x_2-x)f(Q_{12})+(y-y_1)(x-x_1)f(Q_{22}) \end{split}
f(P)=(y2−y)f(R1)+(y−y1)f(R2)=(y2−y)[(x2−x)f(x1,y1)+(x−x1)f(x2,y1)]+(y−y1)[(x2−x)f(x1,y2)+(x−x1)f(x2,y2)]=(y2−y)(x2−x)f(x1,y1)+(y2−y)(x−x1)f(x2,y1)+(y−y1)(x2−x)f(x1,y2)+(y−y1)(x−x1)f(x2,y2)=(y2−y)(x2−x)f(Q11)+(y2−y)(x−x1)f(Q21)+(y−y1)(x2−x)f(Q12)+(y−y1)(x−x1)f(Q22) 总结