OpenCV学习日记(2)

绪言

大家好哇,这里是第二篇的OpenCV学习日记,和上一篇是一脉相承的。

图像基本要素简介

图像有几个要素,像素、通道(色彩空间)是我们要研究基本的两个要素。
像素,也就是图像的最基本的单位,我们知道,图像是用矩阵存储在计算机当中的,而像素则是图像矩阵中最基本的矩阵单位。像素由通道的值决定颜色,因此,通道才是最基本的要素。而通道组成了色彩空间,下面我们来看一下常用的色彩空间:

1.灰度色彩空间

也就是我们常说的灰度图,灰度图的一大特点就是它所需的存储空间小(因为抛弃了色彩信息,大小直接就砍到1/3)。而我们常说的人脸识别,是不需要彩色信息的(因为我们只需要抽取基本特征)。

2.BGR色彩空间

也就是我们在日常生活中最常见到的三原色图。每一个像素点都由三原色的比例调配构成。而在OpenCV中使用BGR而不是使用我们最常用的RGB色彩空间。

3.HSV色彩空间

也就是在PS中最常用的图像三要素:色调、饱和度、亮度。

数学知识简介

我们知道,图像处理最需要的,就是卷积。而卷积,自然而然是数学知识。本篇将会介绍傅里叶变换和卷积操作,以确保读者可以有足够的数学储备。

图像处理中的数学

连续傅里叶变换

在用数学的严谨语言说明什么是傅里叶变换之前,我们先来用一个例子来简单地阐述一下傅里叶变换。
假设我们在听交响乐。并假设大提琴正在拉着A调(440Hz)基频的音调,这里就产生了一个频率440Hz的正弦波。(下面的图像没有按实际比例绘图 ,仅为说明)
sin(x)的图像
然后,F调(880Hz)的钢琴声传来:
sin(2x)的图像
你的耳朵会自动进行傅里叶变换,你会听到这两个声音叠加起来的声波(正弦波的叠加是线性的):
sin(x)+sin(2x)的图像
所以你会听到一个非纯音,这个音是由这两个音叠加而成的。
好,我们管这个叫傅里叶级数。傅里叶级数的表达式为:
f ( x ) = a 0 2 + n = 0 ( a n c o s n x + b n s i n n x )
其中
a 0 = 1 π π π f ( x ) c o s n x d x

b 0 = 1 π π π f ( x ) s i n n x d x
是否取等号要看原函数是否满足狄利克雷条件。
好,傅里叶级数介绍完了。我们下列来简述傅里叶变换。
傅里叶变换,是将信号从时域变为频域的一种变换算子。
有些周期信号,在时域研究是没有意义的,或者说是看不出来任何特征的。那么就需要转换到频域去,研究关于频率的特征。我们先摆出傅里叶变换的表达式:
F ( ω ) = f ( t ) e i ω t d t
该式子的推出要使用傅氏积分的定义和证明,这里我们就不展开讨论了。
傅里叶变换的通俗解释这个视频我觉得很好:
【官方双语】形象展示傅里叶变换
那么,傅里叶变换与傅里叶级数有什么关系呢?
连续形式的傅里叶变换是傅里叶级数的推广,积分是一种极限形式的求和算子。而我们知道,傅里叶级数就是一系列求和的逼近过程。
傅里叶级数与傅立叶变换 | 熟肉

离散时间傅里叶变换

我们知道,很多信号在时间上是离散的,不连续的。对于离散信号来说,我们有离散时间傅里叶变换。
{ x n } 是一个定义域为 Z 的数列( n ( , ) ) ,则其离散时间傅里叶变换(DTFT)定义为:
X ( ω ) = n = x n e i ω n
DTFT在时域上离散,在频域上是周期的。对于一般的离散时间信号,我们不直接使用DTFT,我们使用FFT(快速傅里叶变换)在计算机上面实现。

离散傅里叶变换

在计算机中,我们使用DFT(离散傅里叶变换)作为处理离散信号的原理:
对于序列 { x n } n = 0 N 1 来说,它的DFT为:
X [ k ] = n = 0 N 1 x n e i 2 π k n / N

傅里叶逆变换

我们称
f ( t ) = 1 2 π F ( ω ) e i ω t d ω
为傅里叶变换的逆变换,我们可以通过这个公式,来求出卷积后函数的表达式。

卷积

卷积是泛函分析里的概念,要求读者需要有实变函数的基础知识。如果没有,就暂且听一下吧。
卷积,我们可以把它看作滑动平均。
设: f ( x ) g ( x ) 是R1上的两个可积函数,我们设积分:
f ( τ ) g ( x τ ) d τ
为新函数的表达式,我们称这个新函数为这两个函数的卷积。可以证明,几乎对于所有的实数 x ,该积分都是存在的。记作: h ( x ) = ( f g ) ( x )
可以证明: ( f g ) ( x ) = ( g f ) ( x )
那么为什么要提卷积和傅里叶变换呢?
是因为函数卷积的傅里叶变换是函数傅里叶变换的乘积,所以要介绍傅里叶变换。
我们设 F 为傅里叶变换算子,则有
F ( g ( x ) f ( x ) ) = F ( g ( x ) ) F ( f ( x ) )
其中 g ( x ) f ( x ) g f 的卷积
这样可以极大地简化卷积计算,而卷积计算是图像处理的基础,是滤波器的主要原理。

滤波器

简介

滤波器是一种卷积操作,它通过一种卷积核(convolution kernel)来对对应的每个图像像素矩阵进行卷积操作,来得到一幅滤波后的图像。
以下这段文字可以形象地阐述kernel的概念:
核是一组权重的集合,它会应用在图像的每一个区域,生成一个新的像素,比如大小为7为核意味着每49个原图像的像素生成一个新图像的像素,可以把核看作一块覆盖在原图像可移动的毛玻璃片,玻璃片覆盖区域的光线会根据毛玻璃的性质混合之后透出来。

高通滤波器

高通滤波器,是指检测图像的某个区域,然后根据像素与周围像素的亮度差值来提升该像素亮度的滤波器。它的特点是,中间权重大,邻近权重小甚至为负,这样可以削弱邻近的亮度并提升自身像素点的亮度。

# 高通滤波器
import cv2
import numpy as np
from scipy import ndimage
kernel_3x3=np.array([[-1,-1,-1],
                     [-1,8,-1],
                     [-1,-1,-1]])
kernel_5x5=np.array([[-1,-1,-1,-1,-1],
                     [-1,1,2,1,-1],
                     [-1,2,4,2,-1],
                     [-1,1,2,1,-1],
                     [-1,-1,-1,-1,-1]])
//开始滤波
img=cv2.imread('color_small.jpg',0)
k3=ndimage.convolve(img,kernel_3x3)//卷积
k5=ndimage.convolve(img,kernel_5x5)
//高斯锐化(高通滤波器)
blurred=cv2.GaussianBlur(img,(11,11),0)
g_hpf=img-blurred
cv2.imshow("3x3",k3)
cv2.imshow("5x5",k5)
cv2.imshow("g_hpf",g_hpf)
cv2.waitKey()
cv2.destroyAllWindows()

执行结果如下:
这里写图片描述
(从左到右依次为原图,3x3滤波,5x5滤波,高斯滤波)
我们可以看到,高斯核锐化明显地锐化了图像轮廓以及文字边缘。我们可以猜想,高斯滤波是拿来勾勒图像轮廓线条的一种强有力的滤波器。
高斯滤波器的kernel满足高斯函数(也就是我们常说的正态分布)。

低通滤波器

低通滤波器,作用则与高通滤波器相反,它主要用于平滑该像素的亮度,用于去噪和模糊化。高斯模糊是最常用的低通滤波器,它是一个削弱高频信号强度的滤波器。高斯模糊将会在后面介绍到。

猜你喜欢

转载自blog.csdn.net/weixin_40427089/article/details/81415851
今日推荐