opencv--图像平滑

本文介绍了图像处理中的噪声类型,包括椒盐噪声和高斯噪声,以及常用的图像平滑方法:均值滤波、高斯滤波和中值滤波。椒盐噪声表现为随机的黑白点,而高斯噪声遵循正态分布。图像平滑通过低通滤波去除噪声,均值滤波简单快速但可能导致图像模糊,高斯滤波适用于去除高斯噪声,中值滤波则对椒盐噪声有良好效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.图像噪声

在图像采集、处理、传输等过程不可避免地会受到噪声的污染,妨碍人们对图像理解及分析处理。常见的图像噪声有:高斯噪声、椒盐噪声等。

1.1 椒盐噪声

椒盐噪声,即脉冲噪声,是图像中经常见到的一种噪声。它是一种随机出现的白点或黑点,即可能是亮的区域有黑色像素或者可能是暗的区域有白色像素(或者二者都有)。椒盐噪声的成因可能是影像讯号受到突如其来的强烈干扰而产生、类比数位转换器或位元传输错误等。例如:失效的感应器导致像素值位最小值,饱和的感应器导致像素值为最大值。
在这里插入图片描述

1.2 高斯噪声

高斯噪声,即正态噪声,是指噪声密度函数服从高斯分布的一类噪声。由于高斯噪声在空间和频域中数学上的易处理性,这种噪声模型经常被用于实践中。高斯随机变量Z的概率密度函数由下式给出:
p ( z ) = 1 2 π σ e − ( z − u ) 2 2 σ 2 p(z) = \frac{1}{\sqrt{2\pi \sigma}} e^{\frac{-(z-u)^2}{2\sigma^2}} p(z)=2πσ 1e2σ2(zu)2
其中, z z z表示灰度值, u u u表示 z z z的平均值或期望值, σ \sigma σ表示 z z z的标准差。标准差的平方 σ 2 \sigma^2 σ2称为 z z z的方差。高斯函数的曲线如图所示:
在这里插入图片描述
在这里插入图片描述

2 图像平滑简介

图像平滑,从信号处理的角度来言:去除其中的高频信息,保留低频信息。因此,可以对图像进行低通滤波。低通滤波可以去除图像中的噪声,对图像进行平滑。

根据滤波器的不同可以分为:均值滤波、高斯滤波、中值滤波、双边滤波。

2.1 均值滤波

采用均值滤波模板对图像噪声进行滤除。令 S x y S_{xy} Sxy表示中心在 ( x , y ) (x,y) (x,y)点,尺寸为 m × n m×n m×n的矩形子图像窗口的坐标组。均值滤波器可表示为:
f ^ ( x , y ) = 1 m n ∑ ( s , t ) ∈ S x y g ( s , t ) \widehat{f}(x,y) = \frac{1}{mn} \sum_{(s,t ) \in S_{xy}}g(s,t) f (x,y)=mn1(s,t)Sxyg(s,t)
由一个归一化卷积框完成的。它只是用卷积框覆盖区域所有像素的平均值来代替中心元素。

均值滤波的优点是算法简单,计算速度较快;缺点是去噪的同时去除了很多细节部位,将图像变得模糊。
API接口:cv2.blur(src, ksize, anchor, borderType)

参数:

  • src:输入图像
  • ksize:卷积核大小
  • anchor:默认值(-1,-1),表示核中心
  • bordertype:边界类型
    • BORDER_DEFAULT - (边界默认)openCV中默认的处理方法,自动填充图像边界(效果像是映像一样)
    • BORDER_CONSTANT – (边界常数)填充边缘用指定像素值,使用常数填充边界。
    • BORDER_REPLICATE – (边界复制)填充边缘像素用已知的边缘像素值,复制原图中最临近的行或者列。
    • BORDER_WRAP – (边界包装)用另外一边的像素来补偿填充。
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
# 1 图像读取
img = cv.imread('./image/dogsp.jpeg')
# 2 均值滤波
blur = cv.blur(img,(5,5))
# 3 图像显示
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img[:,:,::-1]),plt.title('原图')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur[:,:,::-1]),plt.title('均值滤波后结果')
plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述

2.2 高斯滤波

二维高斯是构建高斯滤波器的基础,其概率分布函数如下所示:
G ( x , y ) = 1 2 π σ 2 e x p { − x 2 + y 2 2 σ 2 } G(x,y) = \frac{1}{2 \pi \sigma^2}exp \{ - \frac{ x^2 + y^2 }{ 2 \sigma^2} \} Gx,y=2πσ21exp{2σ2x2+y2}
G ( x , y ) G(x, y) G(x,y)的分布为一个突起帽子的形状。 σ \sigma σ可看作为两个值,一个是 x x x方向的标准差 σ x \sigma_x σx,另一个方向的标准差 σ y \sigma_y σy

σ x \sigma_x σx σ y \sigma_y σy取值越大,整个形状趋于扁平;当 σ x \sigma_x σx σ y \sigma_y σy取值越小,整个形状越突起。

正态分布是一种钟形曲线,越接近中心,取值越大;越远离中心,取值越小。计算平滑结果时,只需将中心点作为原点,其他店按照其在正态曲线上的位置,分配权重,就可以得到一个加权平均值。

高斯平滑在从图像中去除高斯噪声方面非常有效。

高斯平滑的流程

  1. 首先确定权重矩阵,假定中心点坐标为 ( 0 , 0 ) (0, 0) (0,0),那么距离它最近的8个点坐标如下:
    在这里插入图片描述
  2. 为计算权重矩阵,需要设定 σ \sigma σ的值,假定 σ = 1.5 \sigma = 1.5 σ=1.5,则模糊半径为1的权重矩阵如下:
    在这里插入图片描述
  3. 在计算这9个点的加权平均时,还须让他们的权重值之和为1,因此,将这9个点分别除以其目前九个值之和,得到最终的权重矩阵:
    在这里插入图片描述
  4. 计算高斯模糊。得到权重矩阵后,进而计算高斯模糊的值。假设现有9个像素点,灰度值(0-255)如下:
    在这里插入图片描述
    每个点乘以对应的权重值:
    在这里插入图片描述
    将这9个值加起来,就是中心点的高斯模糊值。

对所有点重复这个过程,就可以得到高斯模糊后的图像;原图为彩色图像时,可以对RGB三个通道分别做高斯平滑。

API接口cv2.GaussianBlur(src,ksize,sigmaX,sigmay,borderType)

参数:

  • src:输入图像
  • ksize:高斯卷积核大小。注:卷积核的宽度核高度都应为奇数且可以不同
  • sigmaX:水平方向的标准差
  • sigmaY:垂直方向的标准差,默认为0,表示与sigmaX相同
  • bordertype:填充边界类型
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
# 1 图像读取
img = cv.imread('./image/dogGasuss.jpeg')
# 2 高斯滤波
blur = cv.GaussianBlur(img,(3,3),1)
# 3 图像显示
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img[:,:,::-1]),plt.title('原图')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur[:,:,::-1]),plt.title('高斯滤波后结果')
plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述

2.3 中值滤波

中值滤波是一种典型的非线性滤波技术,基本思想是用像素点领域灰度值的中值来代替该像素点的灰度值。

中值滤波对椒盐噪声尤其有用,因为它并不依赖于领域内那些与典型值差别很大的值。

API:cv.medianBlur(src, ksize )
参数:

  • src:输入图像
  • ksize:卷积核大小
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
# 1 图像读取
img = cv.imread('./image/dogsp.jpeg')
# 2 中值滤波
blur = cv.medianBlur(img,5)
# 3 图像展示
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img[:,:,::-1]),plt.title('原图')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur[:,:,::-1]),plt.title('中值滤波后结果')
plt.xticks([]), plt.yticks([])
plt.show()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值