图像的感知和获取
我们感兴趣的多数图像都是用“照射 ”源和形成图像的场景元素对光能的反射或吸收而产生的。
通过将输入电能和对特殊类型检测能源敏感的传感器材料组合,把输入能源转变为电压。输出电压波形是传感器的相应,通过把传感器响应数据化,从每一个传感器得到一个数字量。
简单图像形成模型
我们用形如 f(x,y) f ( x , y ) 的二维函数来表示图像。 在空间坐标 (x,y) ( x , y ) 出, f f 的值或幅度是一个证的标量,其物理意义有图像源决定。当一副图像由物理过程产生时,其亮度值正比于物理源(x线)所辐射的能量。
入射到被观察场景的光源照射量
场景中物体所反射的光照总量
图像的取样,量化
图形的采样和量化是连续图像的离散化。
图形的采样: 这个应该是空间分辨率的概念,单位距离内采样的点的间隔。
图像的量化: 像素分辨率的概念。 简单的说就是灰度级。 普通量化灰度级是0~256。
《数字图像处理》中有一个图形很好的说明的采样和量化的概念。
数字图像的表示
图像的大小
s=M∗N∗k
s
=
M
∗
N
∗
k
M,N是图像的大小,相当于矩阵的行列的大小。
k是灰度级的指数。
k
是
灰
度
级
的
指
数
。
灰度级
L=2 k
L
=
2
k
空间内插
内插:是用已知数据来估计未知位置的处理。
最近邻域插值法
// 图像放大 *2
int x = 0,
y = 0,
i = 0,
j = 0;
for(int y = 0; y < 256; y++)
{
for(int x = 0; x < 256; x++)
{
i = y * 2;
j = x * 2;
OutputArray[i][j] = InputArray[y][x];
}
}
// 最近邻内插值法
//从x轴开始
for(int y = 0; y < 512; y++)
{
for(int x = 0; x < 512; x+=2)
{
for(int m = 1; m < 2; m++)
{
Outputarray[y][x-m] = Outputarray[y][x];
}
}
}
//y轴进行插值
for(int x = 0; x < 512; x++)
{
for(int y = 0; y < 512; y+=2)
{
for(int m = 1; m < 2; m++)
{
Outputarray[y-m][x] = Outputarray[x][y];
}
}
}
最近邻内插法:直边缘会严重失真。
双线性内插
OutputArray(x,,y)=ax+by+cxy+d
O
u
t
p
u
t
A
r
r
a
y
(
x
,
,
y
)
=
a
x
+
b
y
+
c
x
y
+
d
其中 4个系数可由4个用
(x,y)
(
x
,
y
)
点最近邻点写出的未知方程确定. 这个是《数字图像处理》上面的一段话。读的很是不明白, 所以就在网上找了一下相关的博客。
线性插值
已知数据 (x 0 ,y 0 ) ( x 0 , y 0 ) 与数据 (x 1 ,y 1 ) ( x 1 , y 1 ) 要计算 [x 0 ,x 1 ] [ x 0 , x 1 ] 区间内某一位置 x x 在直线上的值,
y−y 0 x−x 0 =y 1 −y 0 x 1 −x 0 y − y 0 x − x 0 = y 1 − y 0 x 1 − x 0 这个公式是直线方程的两点式
y=x 1 −xx 1 −x 0 y 0 +x−x 0 x 1 −x 0 y 1 y = x 1 − x x 1 − x 0 y 0 + x − x 0 x 1 − x 0 y 1
这个公式其实就是用 x x 到, x 1 x 1 的距离作为一个权重,用于 y 0 y 0 和 y 1 y 1 的加权。双线性插值本质就是在两个方向上做线性插值。
双线性插值
在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。
假如我们想得到未知函数
f
f
在点上的值,假设我们已知函数
f
f
在四个点的值。最常见的情况,
f
f
就是一个像素点的像素值。
首先在方向进行线性插值,得到
f(R 1 )≈x 2 −xx 2 −x 1 f(Q 11 )+x−x 1 x 2 −x 1 f(Q 21 )
f
(
R
1
)
≈
x
2
−
x
x
2
−
x
1
f
(
Q
11
)
+
x
−
x
1
x
2
−
x
1
f
(
Q
21
)
where
R 1 =(x,y 1 )
R
1
=
(
x
,
y
1
)
f(R 2 )≈x 2 −xx 2 −x 1 f(Q 12 )+x−x 1 x 2 −x 1 f(Q 22 ) f ( R 2 ) ≈ x 2 − x x 2 − x 1 f ( Q 12 ) + x − x 1 x 2 − x 1 f ( Q 22 ) where R 2 =(x,y 2 ) R 2 = ( x , y 2 )
然后在 Y Y 方向进行线性插值
综合起来就是双线性插值最后结果:
f(x,y)≈f(Q 11 )(x 2 −x 1 )(y 2 −y) (x 2 −x)(y 2 −y)+f(Q 21 )(x 2 −x 1 )(y 2 −y) (x 2 −x)(y 2 −y)+f(Q 12 )(x 2 −x 1 )(y 2 −y) (x 2 −x)(y 2 −y)+f(Q 22 )(x 2 −x 1 )(y 2 −y) (x 2 −x)(y 2 −y) f ( x , y ) ≈ f ( Q 11 ) ( x 2 − x 1 ) ( y 2 − y ) ( x 2 − x ) ( y 2 − y ) + f ( Q 21 ) ( x 2 − x 1 ) ( y 2 − y ) ( x 2 − x ) ( y 2 − y ) + f ( Q 12 ) ( x 2 − x 1 ) ( y 2 − y ) ( x 2 − x ) ( y 2 − y ) + f ( Q 22 ) ( x 2 − x 1 ) ( y 2 − y ) ( x 2 − x ) ( y 2 − y )
由于图像双线性插值只会用相邻的4个点,因此上述公式的分母都是1.
例如:如果选择一个坐标系统使得 f 的四个已知点坐标分别为 (0, 0)、(0, 1)、(1, 0) 和 (1, 1),那么插值公式就可以化简为
f(x,y)≈f(0,0)(1−x)(1−y)+f(1,0)x(1−y)+f(0,1)(1−x)y+f(1,1)xy
f
(
x
,
y
)
≈
f
(
0
,
0
)
(
1
−
x
)
(
1
−
y
)
+
f
(
1
,
0
)
x
(
1
−
y
)
+
f
(
0
,
1
)
(
1
−
x
)
y
+
f
(
1
,
1
)
x
y
.
值得注意的是坐标系的选择问题,或者说源图像和目标图像之间的对应问题。
源图像和目标图像的原点
(0,0)
(
0
,
0
)
均选择左上角,然后根据插值公式计算目标图像每点像素,假设你需要将一副
5×5
5
×
5
的图像缩小成
3×3
3
×
3
,那么源图像和目标图像各个像素之间的对应关系如下 :
image 1
从图中可以很明显的看到,如果选择右上角为原点 (0,0) ( 0 , 0 ) ,那么最右边和最下边的像素实际并没有参与计算,而且目标图像的每个像素点计算出灰度值也相对于源图像偏左偏上。
那么,让坐标加1或者选择右下角为原点怎么样呢? 很不幸,还是一样的效果,不过这次得到的图像将偏右偏下。
最好的方法就是,两个图像的几何中心重合,并且目标图像的每个像素之间都是等间隔的。并且都和两边有一定的边距。
image 2
int x = (i + 0.5) * (m/a) - 0.5 //(m/a)(n/b) 是源图像和目标图像的行列之比
int y = (j + 0.5) * (n/b) - 0.5
//替换下面公式
int x = i * (m/a);
int y = j * (n/b);
图像缩小(down sampled) 下采样或者降采样。 目的:
1、使得图像符合显示区域的大小;2、生成对应图像的缩略图。
图像放大(up sampled)上采样或者图像插值。
主要目的:放大原图像,从而可以显示在更高分辨率的显示设备上。
对图像的缩放操作并不能带来更多关于该图像的信息, 因此图像的质量将不可避免地受到影响。然而,确实有一些缩放方法能够增加图像的信息,从而使得缩放后的图像质量超过原图质量。
2.6.2线性操作和非线性操作
iamge 1
image 2