slam 基础 --(2)基本图像处理

一、图像传感器

1.CMOS 和 CCD

(1) CMOS

每个像素里的光电二极管遇到光时,就会因为光电效应累计一定数量的电荷,将光信号转为电信号
CMOS 每个像素均包含放大器和 AD 转换电路,额外的电路使得像素的可感光面积变小,感光度低
每个像素也会因为电路干扰产生固定的噪声信号

(2) CCD

在像素上增加电压,透过电荷耦合,将像素点中的电荷逐级转移到相同输出端,
最后逐个输出电压信号,通过 A/D 转换变为数字信号
CCD 需要比较高的电压,增加功耗

【回形针化】CMOS 与 CCD 有何不同

2. 颜色

(1) Bayer Pattern (拜尔阵列)

拜耳阵列指的是 CCD 或者 CMOS 器件作为光传感器的时候,采集数字图像时用到的一种常见的方法。
bayer pattern 得到的图像中,实际只有 $1\over3$ 的内容是真实的,其他都是根据先验知识插值得到。这也说明了自然图像中具有大量的冗余信息。
Q:具体如何从 bayer pattern 中将高清图片重建出来?
拜耳阵列(Bayer Pattern)简介

(2) 颜色空间

RGB
HSV
LAB:两个颜色的差异可以用向量距离表示

3.global shutter (全局快门) 和 rolling shutter (卷帘快门 果冻效应)

CMOS 是由上往下逐行扫描
避免果冻效应的三种方法:
(1) 搭配机械快门(全局曝光的缺点:如果曝光时间长会增加读出噪声)
(2) 使用没有果冻效应的传感器(使用全域快门的 CMOS 和 CCD 传感器)
(3) 提升 CMOS 的刷新频率
(4) 拍摄较为稳定的素材进行后期修正(稳定器 ex:Steadicam、电子三轴稳定器、Trinity)

后面处理多视角几何的前提是:图像是利用针孔模型取得,rolling shutter 会破坏这个前提。

什么是果冻效应?它是怎么产生的 ——【菲林番外】
详细图解,一眼就能看懂!卷帘快门(Rolling Shutter)与全局快门(Global Shutter)的区别

二、图像在计算机中就是一个阵列

1. 图像可以看出一个二维函数

在一个像素点周围可以看出连续的函数,可以利用高数中的分析方法
例如:局部进行泰勒展开,梯度进行线性近似

2. 图像在计算机中是一个二维阵列

三、线性滤波器

1. 滤波和卷积(基于线性核的滤波,就是我们所熟悉的卷积)

信号处理称为滤波器,数学称为卷积核
卷积核大小大部分为奇数,这样才有中心
图像卷积与滤波的一些知识点

(1) 均值模糊 Box Filter (Averaging)
(2) 高斯模糊 Gaussian Filter
(3) 卷积后的大小
假设原始图像为 $M \times M$,卷积核大小为 $N \times N$,边缘填充像素个数为 pad,步长为 stride
则卷积后图像的尺寸为 $\displaystyle m={M-N+2 \times pad \over stride} +1$
(4) 卷积相当于 4 个嵌套回圈
(5) 卷积的快速计算 FFT

2. 图像梯度算子

图像梯度计算的是图像变化的速度。对于边缘部分,其灰度值变化较大,梯度值也较大;相反,较平滑的部分,灰度值变化较小,相应的梯度值也较小,一般情况时,图像梯度计算的是图像的边缘信息。严格来讲,计算图像梯度需要求导数,但是图像梯度一般通过计算像素值的差来得到梯度的近似值(近似导数值)。
边界是指左侧的像素值与右侧的像素值差值不为零。
(1) sober 算子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import cv2
img = cv2.imread ('dige.jpg')
// 不能写成 sobelx = cv2.Sobel (img, -1,1,0)
// 因为 - 1 代表输入和输出的图像深度是一样的 (例如 8 位位图 0-255)
// 如果相减的灰度值是负数会截断成 0
// 所以指定的深度较大 cv2.CV_64F,可以包含负数
sobelx = cv2.Sobel (img, cv2.CV_64F,1,0)
sobely = cv2.Sobel (img, cv2.CV_64F, 0,1)
// 然后再利用 cv2.convertScaleAbs 转换成正数
sobelx = cv2.convertScaleAbs (sobelx)
sobely = cv2.convertScaleAbs (sobely)
//xy 分开算再相加而不是写成 sobel = cv2.Sobel (img, cv2.CV_64F,1,1)
sobelxy = cv2.addWeighted (sobelx,0.5,sobely,0.5,0)
cv2.imshow ('img',img)
cv2.imshow ('sobelxy',sobelxy)
cv2.waitKey ()
cv2.destroyAllWindows ()

(2) scharr 算子
Scharr 算子可以被看做是对 Sobel 算子的改进,不仅具有和 sobel 算子同样的速度,且精度更高。
在函数 cv2.Sobel () 中,如果 ksize=-1,则会使用 Scharr 滤波器。
Q:为什么换成这样的参数会使得细节处理的比较好?
(3) laplace 算子
laplace 算子类似于二阶 sobel 导数,实际上在 opencv 中是通过调用 sobel 算子来计算 laplace 算子。
Q:如何通过 sobel 算子计算出 laplace 算子?
1
2
3
4
5
6
7
8
import cv2
img = cv2.imread ('opencv.jpg',cv2.IMREAD_GRAYSCALE)
laplacian = cv2.Laplacian (img,cv2.CV_64F)
laplacian = cv2.convertScaleAbs (laplacian)
cv2.imshow ('img',img)
cv2.imshow ('laplacian',laplacian)
cv2.waitKey ()
cv2.destroyAllWindows ()

【OpenCV 学习】图像梯度:Sobel 算子、Scharr 算子、Laplacian 算子
这系列的视频

四、图像求导

五、非线性滤波器

六、模板匹配 - SSD/ZNCC

七、直方图均衡化 / 特例化

(1)
(2)
(3)

1