深度学习机器学习与计算机视觉程序员

年底决战 SLAM(F)

2019-12-02  本文已影响0人  zidea

滤波(filter)

今天我们了解什么是滤波以及滤波在图像处理和计算机视觉上的重要性。首先我们来看什么滤波。我们通过对图像进行滤波来进行降噪和特征提取。其中一些重要特征提取的算法都少不了滤波。我们可能会疑惑图像跟波有什么关系?我们可以将图像灰度变化理解为信号的波。通过对灰度变化观察和处理来分析和处理图像。

卷积核

无论是在计算机视觉还是机器学习中图像识别问题都少不了卷积核,卷积核扫图像,通过对像素邻域(周围)点像素值加权求和后取平均值来更新当前像素值。那么卷积核可以看为我们需要滤波器,在波经过滤波器被滤波器所处理。

复习导数和均值

我们在是如何观察灰度变化率,求曲线变化率就是对曲线进行求导,所以有必要复习导数知识。

导数(Derivative)

这个在初中可能就学习过去,速度是表示距离单位时间的变化率,那么加速度表示单位时间速度变化率。
\frac{df}{dx} = \lim_{\Delta x \rightarrow 0 } \frac{f(x) - f(x - \Delta x)}{\Delta x} = f \prime (x) = f_x

我们知道距离求导就是物体的运动在某个时刻的速度
v = \frac{ds}{dx}
我们知道对速度求导就是物体的运动在某个时刻的加速度(衡量速度变化)
a = \frac{dv}{dx}

因为图像数据是一个一个像素点,所以数据是离散的,我们将连续问题转化为离散上,假设最小变换就是移动一个单位,现在我们将变换参照从时间上转移到空间上
\frac{df}{dx} = \frac{f(x) - f(x-1)}{1} = f \prime (x)

\frac{df}{dx} = f(x) - f(x-1) = f \prime (x)

通过下方程我们可以看出是如何去像素进行求导
\begin{aligned} f(x) = [10,15,10,10,25,20,20,20] \\ f \prime (x) = [0,5,-5,0,15,-5,0,0] \\ f \prime \prime (x) = [0,5,-10,5,15,-20,5,0] \end{aligned}
这里大家自己计算一下很简单后项减去前项除以1即可[-1,1],这样就会发现一维变化率。

我们图片是2D维数据,我们可以用 openvc 的命令查看一下图片具体数据结构

   img = cv2.imread("img/bird.jpg")
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    print(gray)
[[136 135 133 ... 101 101 101]
 [136 135 133 ... 101 101 101]
 [136 134 133 ... 101 101 101]
 ...
 [204 213 206 ...  86  86  87]
 [198 200 186 ...  86  86  87]
 [191 189 162 ...  86  87  87]]
2维 导数(Derivatives in 2 Dimensions)

那么我们来看一看对有两个特征的函数进行求导,也就是 2维求导
f(x,y) \tag{Given function}

因为函数变换率体现在 x 和 y 两个变量上,所以我们需要分别对 x 和 y 进行求偏导,然后用一个向量来表示变化率。
\nabla f(x,y) = \begin{bmatrix} \frac{\partial f(x,y)}{\partial f(x)} \\ \frac{\partial f(x,y)}{\partial f(y)} \end{bmatrix} = \begin{bmatrix} f_x \\ f_y \end{bmatrix} \tag{Gradient vector}

下面变化率大小,就是通过对 x 和 y 取模,也就是求距离
|\nabla f(x,y)| = \sqrt{f_x^2 + f_y^2} \tag{Gradient magnitude}
一维变化率是一个向量,向量不但有大小而且有方向表示变化率方向

\theta = \tan^{-1} \frac{f_x}{f_y} \tag{Gradient direction}

滤波一个简单应用

我们现在停下做一个小实验,通过过滤做一个有趣的简单实验
\begin{bmatrix} 0 & 0 & 0 \\ 0 & 0 & 1 \\ 0 & 0 & 0 \end{bmatrix}
我们用这样卷积核扫过图像,会起到像右侧平移图像一个像素的效果。要做到这个件事我们需要几个步骤

for i in (1,img_height - 1)
    for j in (1,img_width - 1)
        更新 img[i,j]
def move_img_by_filter(img):
    conv = cnp.array([0,0,0,0,0,1,0,0,0]).reshape(3,3)
    h = img.shape[0]
    w = img.shape[1]
    for i in range(1,h-1):
        for j in range(1,w-1):
            print(img[i,j])
            img[i,j] = (img[i-1,j-1] * conv[0,0] + img[i-1,j]*conv[0,1] + img[i-1,j+1]*conv[0,2] +
                img[i,j-1] * conv[1,0] + img[i,j]*conv[1,1] + img[i,j+1]*conv[1,2] +
                img[i+1,j-1] * conv[2,0] + img[i+1,j]*conv[2,1] + img[i+1,j+1]*conv[2,2])
            # print(img[i,j])
    return img
上一篇 下一篇

猜你喜欢

热点阅读