雾看OpenCV(7)——图像平滑

在这里插入图片描述

目录

  • 前言
  • 正文
    • 2D卷积
    • 低通滤波模糊
      • 平均
      • 高斯模糊
      • 中值模糊
      • 双边滤波
        • cv.bilateralFilter
      • code
  • 参考

前言

目标是:
1、学习使用不同的低通滤波器对图像进行模糊
2、使用自定义的滤波器对图像进行卷积(2D 卷积)
首先,明确低通滤波(LPF)帮助我们去除噪音,模糊图像。HPF(高通滤波) 帮助我们找到图像的边缘。

正文

2D卷积

效果图

code

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

src = cv.imread("../../images/lena.jpg")

kernel = np.ones((5,5),np.float32)/25
dst = cv.filter2D(src,-1,kernel)
cv.imshow("src",src)
cv.imshow("dst",dst)
cv.waitKey(0)
cv.destroyAllWindows()

雾看OpenCV(7)——图像平滑_第1张图片

ddepth:图像深度是指存储每个像素所用的位数,它也是用来度量图像的色彩分辨率的。它确定了彩色图像的每个像素可能有的色彩数,或者确定灰度图像的每个像素可能有的灰度级数。它决定了色彩图像中可能出现的最多的色彩数,或者灰度图像中的最大灰度等级。

低通滤波模糊

作为是去除高频部分,比如噪音,边界等。

平均

使用的函数是cv.blur ()或是cv.boxFilter()。
效果图
雾看OpenCV(7)——图像平滑_第2张图片

高斯模糊

现在把卷积核换成高斯核(简单来说,方框不变,将原来每个方框的值是 相等的,现在里面的值是符合高斯分布的,方框中心的值最大,其余方框根据 距离中心元素的距离递减,构成一个高斯小山包。原来的求平均数现在变成求 加权平均数,全就是方框里的值)。最大作用是去除高斯噪声
实现的函数是:cv.GaussianBlur()。
注意,参数中,我们要指定的高斯核的宽和高都要是奇数,并且还要指定x方向和y方向的标准差。

效果图

中值模糊

用与卷积框对应像素的中值来替代中心像素的值。这个滤波 器经常用来去除椒盐噪声。前面的滤波器都是用计算得到的一个新值来取代中 心像素的值,而中值滤波是用中心像素周围(也可以使他本身)的值来取代他。 他能有效的去除噪声。卷积核的大小也应该是一个奇数。
效果图

看来,中值滤波还是很适合椒盐噪声的过滤的。

双边滤波

效果图
雾看OpenCV(7)——图像平滑_第3张图片

函数 cv2.bilateralFilter()在保持边界清晰的情况下有效的去除噪 音。但是这种操作与其他滤波器相比会比较慢。我们已经知道高斯滤波器是求 中心点邻近区域像素的高斯加权平均值。这种高斯滤波器只考虑像素之间的空 间关系,而不会考虑像素值之间的关系(像素的相似度)。所以这种方法不会考 虑一个像素是否位于边界。因此边界也会别模糊掉,而这正不是我们想要。 双边滤波在同时使用空间高斯权重和灰度值相似性高斯权重。空间高斯函 数确保只有邻近区域的像素对中心点有影响,灰度值相似性高斯函数确保只有 与中心像素灰度值相近的才会被用来做模糊运算。所以这种方法会确保边界不 会被模糊掉,因为边界处的灰度值变化比较大。

cv.bilateralFilter

雾看OpenCV(7)——图像平滑_第4张图片

code

code

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

src = cv.imread("../../images/lena.jpg")
sp_lena = cv.imread("../../images/sp_lena.jpg")
gasuss_lena = cv.imread("../../images/gasuss_lena.jpg")
bilateraPicture = cv.imread("../../images/bilateralPicture.jpg")
kernel = np.ones((5,5),np.float32)/25
filter2D = cv.filter2D(src,-1,kernel)
blurImage = cv.blur(src,(5,5))
gaussionImage = cv.GaussianBlur(gasuss_lena,(5,5),0)
mediaBlur = cv.medianBlur(sp_lena,5)
bilateraBlur = cv.bilateralFilter(bilateraPicture,9,75,75)

cv.imshow("Filter2D_dst",filter2D)
cv.imshow("src",src)
cv.imshow("sp_lena",sp_lena)
cv.imshow("gasuss_lena",gasuss_lena)
cv.imshow("bilateraPicture",bilateraPicture)

cv.imshow("medianBlur",mediaBlur)
cv.imshow("blurImage",blurImage)
cv.imshow("gaussionImage",gaussionImage)
cv.imshow("bilateraBlur",bilateraBlur)
cv.waitKey(0)
cv.destroyAllWindows()

参考

  1. 给图像添加各种噪声

你可能感兴趣的:(OpenCV,opencv)