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

CV:计算机视觉图像的基础知识—以python的cv2库来了解计算机视觉图像基础

程序员文章站 2022-03-25 17:02:26
...

CV:计算机视觉图像的基础知识—以python的cv2库来了解计算机视觉图像基础

 

 

 

目录

一、图像中的傅里叶变换

1、时域和频域

2、傅里叶变换

3、图像中的傅里叶变换

1、频域变换

2、时域变换—HPF和LPF

二、图像去噪经典算法—各种滤波器

0、线性滤波器和非线性滤波器

高斯噪声和椒盐噪声区别

1、均值滤波—像素值取平均值

2、中值滤波—像素值递增排序取中间:常用来去椒盐噪声、斑点噪声

3、高斯滤波—对整幅图像像素值进行加权平均

4、双边滤波—折中图像的空间邻近度和像素值相似度


 

 

相关文章
Py之cv2:cv2库(OpenCV)的简介、安装、使用方法(常见函数、方法等)最强详细攻略
CV:计算机视觉图像的基础知识—以python的cv2库来了解计算机视觉图像基础
CV:计算机视觉图像的基础知识—以python的cv2库来了解计算机视觉图像基础—代码实现
CV:计算机视觉图像的基础知识—以python的cv2库来了解计算机视觉图像基础—代码实现—图像基础各种操作(函数及案例)

 

一、图像中的傅里叶变换

1、时域和频域

时域:从我们出生,我们看到的世界都以时间贯穿,花开花落、生老病死、云彩的移动都会随着时间发生改变。这种以时间作为参照来观察动态世界的方法我们称其为时域分析

频域:如果换一个角度观察世界,这个世界并没有发生变化。为什么呢,原因就是,观察的角度是频域,而不是时域。好,来介绍下什么是频域。以化学反应为例子:

CV:计算机视觉图像的基础知识—以python的cv2库来了解计算机视觉图像基础

         显而易见,随着时间的推移,氢氧化钠与盐酸最终变成了氯化钠和水,在时域的角度,反应物发生了变化。在频域的角度呢,Na+Na+还是Na+Na+,氢原子还是氢原子,本质并没有发生变化,这就是频域角度的分析
    而贯穿时域与频域的方法之一,就是传中说的傅里叶分析。傅里叶分析可分为傅里叶级数(Fourier Serie)和傅里叶变换(Fourier Transformation)。

CV:计算机视觉图像的基础知识—以python的cv2库来了解计算机视觉图像基础CV:计算机视觉图像的基础知识—以python的cv2库来了解计算机视觉图像基础

(1)、频域和时域坐标轴
频域坐标轴:函数随着时间的变化而变化;
时域坐标轴:函数始终是这个函数,它本身没有变化。

 

2、傅里叶变换

          傅大佬告诉我们,任何周期函数,都可以看作是不同振幅A不同相位ψ正弦波的叠加

           比如,可以采用前面说的正弦曲线波,叠加出一个带90度角的矩形波,中间那部分在逐渐的向正方形逼近。不仅仅是矩形,其他能想到的任何波形,都是可以如此方法用正弦波叠加起来的。

CV:计算机视觉图像的基础知识—以python的cv2库来了解计算机视觉图像基础

         傅里叶级数的本质是将一个周期的信号分解成无限多分开的(离散的)正弦波,公式如下,OO表示观察信号,ωω表示频率,ϕϕ表示相位,AA表示振幅。但是宇宙变换似乎并不是周期的,任何常见事物的变化似乎也不是周期的,比如小姐姐每天的行程如果是周期的,那是不是太好下手了,这样就违背了自然规律。 

CV:计算机视觉图像的基础知识—以python的cv2库来了解计算机视觉图像基础

        傅大佬变化到底干嘛呢?当然是贯穿时域和频域的一种分析手段,实际上是对一个周期无限大的函数进行变换,将一个时域非周期的连续信号,转换为一个在频域非周期的连续信号。

         举个栗子:对于钢琴来说,
时域:离散的按键信号变成了连续的信号,就是动听的音乐。
频域:每一次的震动连续起来也就成了连续的信号,从离散谱变成了连续谱。原来离散谱的叠加,变成了连续谱的累积,所以在计算上也从求和符号变成了积分符号。

 

3、图像中的傅里叶变换

CV:计算机视觉图像的基础知识—以python的cv2库来了解计算机视觉图像基础

        上述的例子是一维信号的傅里叶变换,并且信号是连续的。我们知道图像是二维离散的,连续与离散都可以用傅里叶进行变换,那么二维信号无非就是在xx方向与yy方向都进行一次一维的傅里叶变换得到。这么看来,可以想象,它的时域构成就是一个网格矩阵了,横轴从11到nn,纵轴也是这样,所有图像的时域构成都认为是这样的。频域呢,当然同上,也会得到有关频域的网格矩阵。

       离散的二维傅里叶变换,一个图像为M×N的图像f(x,y)进过离散傅里叶变换得到F(u,v),那么一般的公式为:F(u,v)是频域,f(x,y)是时域:

          CV:计算机视觉图像的基础知识—以python的cv2库来了解计算机视觉图像基础        CV:计算机视觉图像的基础知识—以python的cv2库来了解计算机视觉图像基础

 

连续傅里叶变换

CV:计算机视觉图像的基础知识—以python的cv2库来了解计算机视觉图像基础

CV:计算机视觉图像的基础知识—以python的cv2库来了解计算机视觉图像基础

离散傅里叶变换

CV:计算机视觉图像的基础知识—以python的cv2库来了解计算机视觉图像基础

CV:计算机视觉图像的基础知识—以python的cv2库来了解计算机视觉图像基础

 

 

1、频域变换

       将复杂的时间信号或空间信号变换成以频率成分表示的结构形式就是频域变换。
谱图:频域变换以直角坐标形式表示,得到的图形就是常说的谱图。频谱是总称,视频率成分的具体内容还有幅值谱、相位谱、功率谱、能量谱、倒频谱等类型。实现频谱变换的数学原理是傅立叶变换。
幅度谱:通过傅里叶变化来介绍图像的幅度谱,幅度谱呈现了原始图像在变化方面的一种表示:图像最明亮的像素放到*,然后逐渐变暗,在边缘上的像素最暗,这样可以发现图像中亮、暗像素的百分比。(即为频域中的振幅AA的强度)。
        Numpy有一个FFT(快速傅里叶变换)包来完成这个工作,np.fft.fft2()为我们提供了一个复杂数组的频率转换,即一幅图像的离散傅里叶变换。如果没有参数传递,输出数组的大小将与输入相同。

  • 第一个参数是输入图像,它是灰度图像。
  • 第二个参数是可选的,它决定了输出数组的大小。如果它大于输入图像的大小,则输入图像在计算FFT之前填充了0。如果它小于输入图像,输入图像将被裁剪。

CV:计算机视觉图像的基础知识—以python的cv2库来了解计算机视觉图像基础

          可以在中心看到更多的白色区域,表示低振幅的波占到了多数,高振幅的波占少数,而且说明了波的整体频率偏低。因为在波形的调控中,需要较多的直线和近似直线的波来调整。低频波越多,也就是有较多的波近似于直线,也就是,这些波的频率很慢,ω很小。

s1 = np.log(np.abs(fshift))     #取绝对值:将复数变化成实数取对数的目的为了将数据变化到0-255
         采用log函数去映射—而非均值归一化:而不是采取以下的归一化的形式去用,因为矩阵的元素,绝大多数的像素数值都很小,如果采用以下的形式去归一化,绝大多数的数值均很小,会得到一个黑色的图像,归一化这种东西本来就是建模里面一个不好掌控的度。

CV:计算机视觉图像的基础知识—以python的cv2库来了解计算机视觉图像基础

 

import cv2
import numpy as np
import matplotlib.pyplot as plt
 
img = cv2.imread('F:/File_Python/Resources/face_images/ZLY01.jpg', 0) #直接读为灰度图像
img_fft = np.fft.fft2(img)            #做频率变换
img_fft_fshift = np.fft.fftshift(img_fft)     #转移像素做幅度普
img_fft_fshift_log = np.log(np.abs(img_fft_fshift))     #取绝对值:将复数变化成实数取对数的目的为了将数据变化到0-255


plt.subplot(121)
plt.imshow(img, 'gray')
plt.title('original')
 
plt.subplot(122)
plt.imshow(img_fft_fshift_log,'gray')
plt.title('center')
 
plt.show()

 

2、时域变换—HPF和LPF

        进行时域变换,比如高通滤波器。为此,你只需用一个矩形窗口大小,来移除低频部分(频率ω越大,震动越明显),即保留下图像中最有用的信息。那么图像中的什么位置的频率比较高呢,显而易见,边界处。为什么呢,在非交界处,你的波可以慢慢悠悠的抖动来显示信息。在交界处,没有快速的抖动,怎么去显示差异呢?

1、高通滤波器(HPF)—用于检测边缘

        High Pass Filter,是检测图像的某个区域,然后根据像素与周围像素的差值提升该像素亮度的滤波器。矩阵的卷积结果,边界的值越来越大,旁边的值越来越小,也就是,能够检测边缘

CV:计算机视觉图像的基础知识—以python的cv2库来了解计算机视觉图像基础

import cv2
import numpy as np
import matplotlib.pyplot as plt

kernel_9 = np.array([[-1, -1, -1],
                     [-1, 8, -1],
                     [-1, -1, -1]])

kernel_25 = 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('F:/File_Python/Resources/face_images/ZLY01.jpg')
ndimg = np.array(img)



k3 = cv2.filter2D(ndimg, -1, kernel_9)      #convolve calculate 
k5 = cv2.filter2D(ndimg, -1, kernel_25)     #the second parameters measns the deepth of passageway.
#such as cv2.CV_8U means every passageway is 8 bit.
#-1 means the passageway of the source file and the object file is equal.



plt.subplot(131)
plt.imshow(img)
plt.title("source image")

plt.subplot(132)
plt.imshow(k3)
plt.title("kernel = 3")

plt.subplot(133)
plt.imshow(k5)
plt.title("kernel = 5")

plt.show()

2、低通滤波器(LPF)—去噪和模糊化

        与高通滤波器相反的还有低通滤波器(LPF),低筒滤波器与高通滤波器相反,当一个像素与周围像素的插值小于一个特定值时,平滑该像素的亮度,用于去噪和模糊化
(1)、比如PS软件中的高斯模糊,就是常见的模糊滤波器之一,属于削弱高频信号的低通滤波器。中间的图为高通滤波,最右方的图为模糊化后的。

CV:计算机视觉图像的基础知识—以python的cv2库来了解计算机视觉图像基础

import cv2
import numpy as np
import matplotlib.pyplot as plt

kernel_25h = 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]])

kernel_25l = np.array([[0.04, 0.04, 0.04, 0.04, 0.04],
                      [0.04, 0.04, 0.04, 0.04, 0.04],
                      [0.04, 0.04, 0.04, 0.04, 0.04],
                      [0.04, 0.04, 0.04, 0.04, 0.04],
                      [0.04, 0.04, 0.04, 0.04, 0.04]])

img = cv2.imread('F:/File_Python/Resources/face_images/ZLY01.jpg')
ndimg = np.array(img)

k3 = cv2.filter2D(ndimg, -1, kernel_25h)
k5 = cv2.filter2D(ndimg, -1, kernel_25l)

plt.subplot(131)
plt.imshow(img)
plt.title("source image")

plt.subplot(132)
plt.imshow(k3)
plt.title("kernel5hpf")

plt.subplot(133)
plt.imshow(k5)
plt.title("kernel5lpf")
plt.show()

 

 

二、图像去噪经典算法—各种滤波器

         图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。消除图像中的噪声成分叫作图像的平滑化或滤波操作。

1、滤波器:一种形象的比喻法是:我们可以把滤波器想象成一个包含加权系数的窗口,当使用这个滤波器平滑处理图像时,就把这个窗口放到图像之上,透过这个窗口来看我们得到的图像。
        举一个滤波在我们生活中的应用:美颜的磨皮功能。如果将我们脸上坑坑洼洼比作是噪声的话,那么滤波算法就是来取出这些噪声,使我们自拍的皮肤看起来很光滑。

2、图像滤波的两个目的—提取特征+清除噪声
(1)、抽出对象的特征作为图像识别的特征模式;
(2)、为适应图像处理的要求,消除图像数字化时所混入的噪声。

3、滤波处理的两个要求:无损信息+图像清晰
(1)、不能损坏图像的轮廓及边缘等重要信息;
(2)、使图像清晰视觉效果好。

4、图像平滑的两类目的—模糊+消除噪音
        平滑滤波是低频增强的空间域滤波技术。空间域的平滑滤波,一般采用简单平均法进行,就是求邻近像元点的平均亮度值。邻域的大小与平滑的效果直接相关,邻域越大平滑的效果越好,但邻域过大,平滑会使边缘信息损失的越大,从而使输出的图像变得模糊,因此需合理选择邻域的大小。

 

0、线性滤波器和非线性滤波器

         线性滤波器的原始数据与滤波结果是一种算术运算,即用加减乘除等运算实现,如均值滤波器(模板内像素灰度值的平均值)、高斯滤波器(高斯加权平均值)等。由于线性滤波器是算术运算,有固定的模板,因此滤波器的转移函数是可以确定并且是唯一的(转移函数即模板的傅里叶变换)。
         非线性滤波器的原始数据与滤波结果是一种逻辑关系,即用逻辑运算实现,如最大值滤波器、最小值滤波器、中值滤波器等,是通过比较一定邻域内的灰度值大小来实现的,没有固定的模板,因而也就没有特定的转移函数(因为没有模板作傅里叶变换),另外,膨胀和腐蚀也是通过最大值、最小值滤波器实现的。

 

高斯噪声和椒盐噪声区别

          高斯噪声是指噪声服从高斯分布,即某个强度的噪声点个数最多,离这个强度越远噪声点个数越少,且这个规律服从高斯分布。高斯噪声是一种加性噪声,即噪声直接加到原图像上,因此可以用线性滤波器滤除
          椒盐噪声类似把椒盐撒在图像上,因此得名,是一种在图像上出现很多白点或黑点的噪声,如电视里的雪花噪声等。椒盐噪声可以认为是一种逻辑噪声,用线性滤波器滤除的结果不好,一般采用中值滤波器滤波可以得到较好的结果。

 

1、均值滤波—像素值取平均值

            图片中一个方块区域(一般为3*3)内,中心点的像素为全部点像素值的平均值。均值滤波就是对于整张图片进行以上操作。我们可以看下图的矩阵进行理解:
(1)、均值滤波的缺陷—去噪同时也破坏了图像的细节:本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。特别是椒盐噪声。

CV:计算机视觉图像的基础知识—以python的cv2库来了解计算机视觉图像基础

可以看到图片变模糊而且噪声并没有很有效的去除,该算法只是模糊化了图片而已。

CV:计算机视觉图像的基础知识—以python的cv2库来了解计算机视觉图像基础

 

 

 

 

 

 

2、中值滤波—像素值递增排序取中间:常用来去椒盐噪声、斑点噪声

        中值滤波是一种非线性滤波,它能在滤除噪声的同时很好的保持图像边缘。
中值滤波的原理:把以当前像素为中心的小窗口内的所有像素的灰度按从小到大排序,取排序结果的中间值作为该像素的灰度值。

       在一连串数字{1,4,6,8,9}中,数字6就是这串数字的中值。由此我们可以应用到图像处理中。依然我们在图像中去3*3的矩阵,里面有9个像素点,我们将9个像素进行排序,最后将这个矩阵的中心点赋值为这九个像素的中值。

CV:计算机视觉图像的基础知识—以python的cv2库来了解计算机视觉图像基础

可以看到,椒盐噪声很好的被平滑了,而且也没均值那样模糊化太过于严重。

CV:计算机视觉图像的基础知识—以python的cv2库来了解计算机视觉图像基础

 

1、给图片添加椒盐噪声

        椒盐噪声(salt-and-pepper noise)是由图像传感器,传输信道,解码处理等产生的黑白相间的亮暗点噪声。所谓椒盐,椒就是黑,盐就是白,椒盐噪声就是在图像上,随机出现黑色白色的像素。椒盐噪声是一种因为信号脉冲强度引起的噪声,产生该噪声的算法也比较简单。往往由图像切割引起,去除脉冲干扰及椒盐噪声最常用的算法是中值滤波

(1)、addSaltNoise函数,给一副数字图像加上椒盐噪声的步骤,如下:

  • 指定信噪比 SNR(其取值范围在[0, 1]之间)
  • 计算总像素数目 SP, 得到要加噪的像素数目 NP = SP * (1-SNR)
  • 随机获取要加噪的每个像素位置P(i, j)
  • 指定像素值为255或者0。
  • 重复3,4两个步骤完成所有像素的NP个像素
  • 输出加噪以后的图像

CV:计算机视觉图像的基础知识—以python的cv2库来了解计算机视觉图像基础CV:计算机视觉图像的基础知识—以python的cv2库来了解计算机视觉图像基础CV:计算机视觉图像的基础知识—以python的cv2库来了解计算机视觉图像基础

原图→NSR信噪比0.9→NSR信噪比0.7

2、给椒盐噪声图片进行中值滤波

           图像结果可知,仅仅通过中值滤波还不够。因此调整中值滤波器,也就是cv2.medianBlur(img, 3)函数,将ksize的3改为5、7、101,会依次变清晰,但同时也会使图像变模糊,因ksize太大了,把有用的信息也用中值代替了,误差就逐渐显现出来了,因此对ksize的选择直接影响图片的质量。

CV:计算机视觉图像的基础知识—以python的cv2库来了解计算机视觉图像基础CV:计算机视觉图像的基础知识—以python的cv2库来了解计算机视觉图像基础CV:计算机视觉图像的基础知识—以python的cv2库来了解计算机视觉图像基础CV:计算机视觉图像的基础知识—以python的cv2库来了解计算机视觉图像基础

 

3、高斯滤波—对整幅图像像素值进行加权平均

         高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。

CV:计算机视觉图像的基础知识—以python的cv2库来了解计算机视觉图像基础

 

 

4、双边滤波—折中图像的空间邻近度和像素值相似度

        双边滤波不仅考虑了像素信息,也考虑到了像素位置信息。是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折中处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。

CV:计算机视觉图像的基础知识—以python的cv2库来了解计算机视觉图像基础

       Wij为当前像素权值,Pij为当前像素信息,Pi为当前像素邻域均值;Cij为当前像素位置信息,Ci为当前像素平均位置信息,\sigma1与\sigma2分别为当前像素信息、当前像素位置的标准差。

 

 

 

 

 

参考文章
Opencv计算机视觉之路(三)——图像处理(一)傅里叶变换

相关标签: CV