opencv真货第五节

目录

一、滤波器

1.什么是图像卷积

2.步长

3.padding

4.卷积核的大小

5.卷积案例

 二、方盒滤波与均值滤波

三、高斯滤波


一、滤波器

          滤波解决有噪声的图像是有效果的。

1.什么是图像卷积

图像卷积就是卷积核在图像上按行滑动遍历像素时不断的相乘求和的过程。

2.步长

       步长就是卷积核在图像上移动的步幅.上面例子中卷积核每次移动一个像素步长的结果,如果将这个步长修改为2,结果会如何?
为了充分扫描图片,步长一般设为1。

3.padding

从上面例子中我们发现,卷积之后图片的长宽会变小.如果要保持图片大小不变,我们需要在图片周围填充0。

padding指的就是填充的0的圈数。

我们可以通过公式计算出需要填充的0的圈数。

如果要保持卷积之后图片大小不变,可以得出等式:(N+2P-F+1)=N从而可以推导出P= (F-1)/2

4.卷积核的大小

        图片卷积中,卷积核一般为奇数,比如3*3,5*5,7*7。为什么一般是奇数呢,出于以下两个方面的考虑:

  1. 根据上面padding的计算公式,如果要保持图片大小不变,采用偶数卷积核的话,比如4*4,将会出现填充1.5圈零的情况。
  2. 奇数维度的过滤器有中心,便于指出过滤器的位置,即OpenCV卷积中的锚点。

5.卷积案例

  • filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])
  1. ddepth是卷积之后图片的位深,即卷积之后图片的数据类型,一般设为-1,表示和原图类型一致.
  2.  kernel是卷积核大小,用元组或者ndarray表示,要求数据类型必须是float型.
  3. anchor锚点,即卷积核的中心点,是可选参数,默认是(-1,-1)
  4. delta 可选参数,表示卷积之后额外加的一个值,相当于线性方程中的偏差,默认是0.
  5.  borderType边界类型.一般不设.
#opencv中的卷积操作
import cv2
import numpy
import numpy as np

img=cv2.imread('OIP-C.jpg')
#kernel必须是float型
kernel=np.ones((5,5),np.float32)/25

#卷积操作
dst = cv2.filter2D(img,-1,kernel)
cv2.imshow('image',np.hstack((img,dst)))
cv2.waitKey(0)
cv2.destoryALLWindows()

 尝试其他的卷积操作:

#opencv中的卷积操作
import cv2
import numpy
import numpy as np

img=cv2.imread('OIP-C.jpg')
#kernel必须是float型
# kernel=np.ones((5,5),np.float32)/25
#尝试其他卷积核
kernel=np.array([[-1,-1,-1],[-1,8,-1],[-1,-1,-1]])
#卷积操作
dst = cv2.filter2D(img,-1,kernel)
cv2.imshow('image',np.hstack((img,dst)))
cv2.waitKey(0)
cv2.destoryALLWindows()

轮廓效果:

kernel=np.array([[-2,1,0],[-1,1,1],[0,1,2]])

浮雕效果展示: (效果一般,可以找找其他的)

kernel=np.array([[0,-1,0],[-1,5,-1],[0,-1,0]])

锐化效果展示:

 二、方盒滤波与均值滤波

  • boxFilter(src, ddepth, ksize[, dst[, anchor[, normalize[, borderType]l)方盒滤波.
  1. 方盒滤波的卷积核的形式如下:
  2.  normalize = True时, a = 1 / (W* H)滤波器的宽高, normalize =False时, a = 1。
  3. 一般情况我们都使用normalize = True的情况.这时方盒滤波等价于均值滤波。
  • blur(src, ksize[, dst[, anchor[, borderType]]])均值滤波.
#方盒滤波

import cv2
import numpy as np
#读取图片
img1=cv2.imread('OIP-C.jpg')
#不用手动创建卷积核,只需要告诉方盒滤波,卷积核的大小是多少.
dst = cv2.boxFilter(img1,-1,(5,5),normalize=True)
cv2.imshow('img',np.hstack((img1,dst)))
cv2.waitKey(0)
cv2.destoryALLWindows()


#均值滤波

import cv2
import numpy as np
#读取图片
img1=cv2.imread('OIP-C.jpg')
#均值滤波没有位深这个参数ddepth
dst = cv2.blur(img1 ,(5,5))
cv2.imshow('img',np.hstack((img1,dst)))
cv2.waitKey(0)
cv2.destoryALLWindows()

三、高斯滤波

          其实高斯滤波看着高大上,其实就是卷积核满足正态分布。上面两个滤波卷积核不一样。高斯滤波的卷积核是由公式得出来的。用公式怎么算的,也列举了几个。

     要理解高斯滤波首先要知道什么是高斯函数.高斯函数在是符合高斯分布(也叫正态分布)的数据的概率密度函数.画出来长这样子:

     高斯函数的特点是以x轴某一点(这一点称为均值)为对称轴,越靠近中心数据发生的概率越高,最终形成一个两边平缓,中间陡峭的钟型(有的地方也叫帽子)图形。

高斯函数的一般形式为:

                                                                  

 越小,山峰也陡,越大,山峰越平缓。 

    高斯滤波就是使用符合高斯分布的卷积核对图片进行卷积操作。所以高斯滤波的重点就是如何计算符合高斯分布的卷积核,即高斯模板
     假定中心点的坐标是(0.0),那么取距离它最近的8个点坐标,为了计算,需要设定的值。假定=1.5,则模糊半径为1的高斯模板就算如下:

 

根据已给的参数(其他的坐标一样的原理),求出高斯模板:

      

我们可以观察到越靠近中心,数值越大,越边缘的数值越小.符合高斯分布的特点.
      通过高斯函数计算出来的是概率密度函数,所以我们还要确保这九个点加起来为1,这9个点的权重总和等于0.4787147,因此上面9个值还要分别除以0.4787147,得到最终的高斯模板

注:有些整数高斯模板是在归一化后的高斯模板的基础上每个数除上左上角的值,然后取整.

然后向下取整,就是1了。   (可取可不取)

         有了卷积核计算高斯滤波就简单了.假设现有9个像素点,灰度值(0-255))的高斯滤波计算如下:

    将这9个值加起来,就是中滤波的心点的高斯值。对所有点重复这个过程,就得到了高斯模糊后的图像。

  •  GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]])
  1. kernel高斯核的大小.
  2. sigmaX,X轴的标准差
  3. sigmaY,Y轴的标准差,默认为0,这时sigmaY = sigmaX
  4. 如果没有指定sigma值,会分别从ksize的宽度和高度中计算sigma.·选择不同的sigma值会得到不同的平滑效果, sigma越大,平滑效果越明显。
  • 选择不同的sigma值会得到不同的平滑效果, sigma越大,平滑效果越明显.
  •  没有指定sigma时, ksize越大,平滑效果越明显

 这个就是说明sigmaX越大,平滑效果越明显。

import cv2
import numpy as np
#读取图片
img1=cv2.imread('OIP-C.jpg')
dst = cv2.GaussianBlur (img1,(5,5),sigmaX=100)

cv2.imshow('img',np.hstack((img1,dst)))
cv2.waitKey(0)
cv2.destoryALLWindows()

 这个说明没有指定sigma时, ksize越大,平滑效果越明显。

import cv2
import numpy as np
#读取图片
img1=cv2.imread('OIP-C.jpg')
# dst = cv2.GaussianBlur (img1,(5,5),sigmaX=100)
dst = cv2.GaussianBlur (img1,(11,11),sigmaX=0)

cv2.imshow('img',np.hstack((img1,dst)))
cv2.waitKey(0)
cv2.destoryALLWindows()

  

可以找个有噪声的图片测试一下,上面展示的是无噪声的图片。别找椒盐噪声,效果不佳。含有轻点的噪声就行。

参考:(33条消息) 卷积操作的基础知识_王小鹏鹏的博客-CSDN博客_卷积操作

猜你喜欢

转载自blog.csdn.net/qq_40694323/article/details/124651761