欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

OpenCV学习日记(2)

程序员文章站 2024-03-22 09:58:22
...

绪言

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

图像基本要素简介

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

1.灰度色彩空间

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

2.BGR色彩空间

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

3.HSV色彩空间

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

数学知识简介

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

图像处理中的数学

连续傅里叶变换

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

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

离散时间傅里叶变换

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

离散傅里叶变换

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

傅里叶逆变换

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

卷积

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

滤波器

简介

滤波器是一种卷积操作,它通过一种卷积核(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()

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

低通滤波器

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

相关标签: OpenCV Python