(数字图像处理MATLAB+Python)第六章图像平滑-第一节:图像平滑概述和空间域平滑滤波

news2024/12/25 12:44:28

文章目录

  • 一:图像中的噪声
    • (1)图像噪声分类
    • (2)图像噪声的数学模型
    • (3)程序
  • 二:空间域平滑滤波
    • (1)均值滤波
      • A:均值滤波原理
      • B:示例
      • C:分析
      • D:程序
    • (2)高斯滤波
      • A:高斯函数
      • B:高斯滤波原理
      • C:程序
    • (3)中值滤波
      • A:中值
      • B:中值滤波原理
      • C:示例
      • D:中值滤波形状
      • E:程序
    • (4)双边滤波
      • A:原理
      • B:程序

图像平滑(Image Smoothing):是一种数字图像处理技术,用于减少图像中的噪声不规则性,使图像更加平滑和连续。在图像中,噪声通常表现为不规则的、突出的像素值,这可能会导致图像细节丢失,使其难以进行分析和处理。图像平滑技术可以通过对像素值进行滤波来平滑图像,去除这些噪声

在这里插入图片描述

图像平滑主要分为如下两类

  • 空域法 主要借助模板运算,在像素点邻域内,利用噪声像素点特性进行滤波
  • 频域法 指对图像进行正交变换,利用噪声对应高频信息的特点进行滤波

一:图像中的噪声

图像中的噪声:是指在图像中出现的不希望出现的、随机的像素值变化,这些变化可能是由于图像采集设备、传输通道或者图像处理过程中引入的。噪声会使图像中出现不规则的亮度、色彩等异常情况,从而导致图像质量下降,给后续的分析和处理带来困难。也可以理解为真实信号与理想信号之间存在的偏差。噪声通常以二维函数 n ( x , y ) n(x,y) n(x,y)来表示

在这里插入图片描述

(1)图像噪声分类

图像噪声分类

  • 高斯噪声 高斯噪声是最常见的一种图像噪声,其像素值变化符合正态分布。在图像中,高斯噪声通常表现为细小的均匀噪声
  • 椒盐噪声 椒盐噪声是一种随机的噪声,其表现为图像中出现黑白像素点,通常是由于图像传输或采集设备的问题引起的
  • 周期噪声 周期噪声是指在图像中出现周期性的波纹、条纹等形式的噪声,这通常是由于摄像机、扫描仪等采集设备的问题引起的
  • 色彩噪声 色彩噪声是指在图像中出现的颜色偏差,这通常是由于相机传感器的颜色误差、照明条件不足等原因引起的

另外,图像噪声可以根据信号和噪声的关系分为

  • 加性噪声 加性噪声与图像信号不相关,也即 g ( x , y ) = f ( x , y ) + n ( x , y ) g(x,y)=f(x,y)+n(x,y) g(x,y)=f(x,y)+n(x,y)
  • 乘性噪声 乘性噪声与图像信号相关,也即 g ( x , y ) = f ( x , y ) + f ( x , y ) n ( x , y ) g(x,y)=f(x,y)+f(x,y)n(x,y) g(x,y)=f(x,y)+f(x,y)n(x,y)

在信号变化很小时,往往将乘性噪声近似认为加性噪声,而且总是假定信号和噪声互相独立

(2)图像噪声的数学模型

高斯噪声:定义为高斯噪声信号 x x x的概率密度函数

  • μ \mu μ:噪声 x x x的均值或期望值
  • σ \sigma σ:噪声 x x x的标准差

p ( x ) = 1 2 π σ e − ( x − μ ) 2 / 2 σ 2 p(x)=\frac{1}{\sqrt{2 \pi} \sigma} e^{-(x-\mu)^{2} / 2 \sigma^{2}} p(x)=2π σ1e(xμ)2/2σ2
x x x服从高斯分布时,其值有70%落在 [ ( μ − σ ) , ( μ + σ ) ] [(\mu-\sigma),(\mu+\sigma)] [(μσ),(μ+σ)]范围内,且有95%落在 [ ( μ − 2 σ ) , ( μ + 2 σ ) ] [(\mu-2\sigma),(\mu+2\sigma)] [(μ2σ),(μ+2σ)]

在这里插入图片描述

椒盐噪声:定义椒盐噪声信号 x x x有效模型

p ( x ) = { P a x = a P b x = b 0  otherwise  p(x)=\left\{\begin{array}{cc}P_{a} & x=a \\P_{b} & x=b \\0 & \text { otherwise }\end{array}\right. p(x)= PaPb0x=ax=b otherwise 

如下图

  • P a = 0 , P b ≠ 0 P_{a}=0,P_{b} \not=0 Pa=0,Pb=0时,表现为“盐”噪声
  • P a ≠ 0 , P b = 0 P_{a}\not=0,P_{b} =0 Pa=0,Pb=0时,表现为“胡椒”噪声

在这里插入图片描述

可以看出,高斯噪声和椒盐噪声不同分布特性

  • 椒盐噪声:噪声幅值基本相同,出现位置随机
  • 高斯噪声:噪声出现位置是分布在每一像素 点上,幅度值是随机的,分布近似符合高斯 正态特性

(3)程序

在这里插入图片描述

imnoise函数:用于在图像中添加噪声的函数,可以模拟在图像采集、传输、处理等过程中引入的不同类型的噪声。imnoise函数的常见语法格式如下

J = imnoise(I, type)
J = imnoise(I, type, parameters)

其中,I是输入图像,type是噪声类型,可以是字符串形式的字符向量或枚举型变量,parameters是可选的参数,用于控制噪声的强度、分布等。imnoise函数支持以下类型的噪声

  • gaussian:高斯噪声,可选参数包括mean(均值)和var(方差)
  • salt & pepper:椒盐噪声,可选参数包括density(密度)
  • poisson:泊松噪声,无可选参数
  • speckle:乘性噪声,可选参数包括mean(均值)和var(方差)
  • localvar:局部方差噪声,可选参数包括二维数组w(窗口大小)和二维数组var(局部方差)
  • lognormal:对数正态分布噪声,可选参数包括mean(均值)和var(方差)
  • rayleigh:瑞利分布噪声,可选参数为scale(尺度)
  • erlang:伽马分布噪声,可选参数包括shape(形状)和scale(尺度)
  • uniform:均匀分布噪声,可选参数包括lower(下限)和upper(上限)

matlab实现

Image = mat2gray( imread('original_pattern.jpg') ,[0 255]);
noiseIsp=imnoise(Image,'salt & pepper',0.1);  %添加椒盐噪声,密度为0.1  
imshow(noiseIsp,[0 1]); title('椒盐噪声图像');
noiseIg=imnoise(Image,'gaussian'); %添加高斯噪声,默认均值为0,方差为0.01
figure;imshow(noiseIg,[0 1]); title('高斯噪声图像');  

Python实现

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

# 读取图像
img = cv2.imread('original_pattern.jpg', cv2.IMREAD_GRAYSCALE)

# 将图像归一化到 [0,1] 范围内
img = cv2.normalize(img.astype('float'), None, 0.0, 1.0, cv2.NORM_MINMAX)

# 添加椒盐噪声,密度为 0.1
noiseIsp = img.copy()
noiseIsp = np.random.choice([0, 1], size=noiseIsp.shape, p=[0.9, 0.1]).astype('float') * 255
noiseIsp = cv2.merge([noiseIsp, noiseIsp, noiseIsp])
noiseIsp = cv2.cvtColor(noiseIsp, cv2.COLOR_BGR2GRAY)
noiseIsp = cv2.normalize(noiseIsp.astype('float'), None, 0.0, 1.0, cv2.NORM_MINMAX)

# 显示椒盐噪声图像
plt.imshow(noiseIsp, cmap='gray', vmin=0, vmax=1)
plt.title('椒盐噪声图像')
plt.show()

# 添加高斯噪声,默认均值为 0,方差为 0.01
noiseIg = cv2.randn(img.shape, 0, 0.01)
noiseIg = cv2.add(img, noiseIg)

# 将图像归一化到 [0,1] 范围内
noiseIg = cv2.normalize(noiseIg.astype('float'), None, 0.0, 1.0, cv2.NORM_MINMAX)

# 显示高斯噪声图像
plt.imshow(noiseIg, cmap='gray', vmin=0, vmax=1)
plt.title('高斯噪声图像')
plt.show()

二:空间域平滑滤波

空间域平滑滤波:是数字图像处理中常用的一种滤波方法,也被称为模糊滤波。它通过对图像像素周围一定大小的邻域内像素灰度值进行加权平均,以消除图像中的高频噪声和细节信息,从而使图像变得更加平滑。常见有以下几种

  • 均值滤波
  • 高斯滤波
  • 中值滤波
  • 双边滤波

(1)均值滤波

A:均值滤波原理

均值滤波:是以某一像素为中心,在它的周围选择一邻域,将邻域内所有点的均值(灰度值相加求平均)来代替原来像素值

  • S S S:以点 ( x , y ) (x,y) (x,y)为中心的邻域
  • M M M:领域 S S S内总像素数目

g ( x , y ) = 1 M ∑ ( m , n ) ∈ S f ( m , n ) g(x, y)=\frac{1}{M} \sum_{(m, n) \in S} f(m, n) g(x,y)=M1(m,n)Sf(m,n)

如下为常用的线性平滑简单均值模板

在这里插入图片描述

B:示例

如下图

在这里插入图片描述

C:分析

均值滤波的优点是简单易实现,对于一些噪声较小的图像能够取得不错的平滑效果。但是,它也存在一些缺点。例如,它会对图像中的边缘和细节信息造成模糊,同时也可能使得一些噪声点变得更加明显。此外,均值滤波对于椒盐噪声等高斯分布以外的噪声类型效果较差

  • 若邻域内存在噪声,经过平均,噪声幅度会大为降低
  • 点与点之间的灰度差值变小,边缘和细节处变得模糊
  • 邻域半径越大,图像模糊程度越厉害

D:程序

在这里插入图片描述

fspecial函数:用于生成一些常见的滤波器卷积核的函数。这些卷积核可以用于各种图像处理任务,例如平滑、锐化、边缘检测等。fspecial 函数返回一个二维的卷积核矩阵 H,该矩阵的大小和形状由参数 type 和可选参数决定。可以将该卷积核作为参数传递给 MATLAB 中的卷积函数,如 conv2 函数,对图像进行滤波操作。该函数语法如下

H = fspecial(type, varargin)

其中,参数 type 指定了要生成的卷积核的类型。type 可以取以下字符串值:

  • 'average':平均滤波器;
  • 'disk':圆形平滑滤波器;
  • 'gaussian':高斯滤波器;
  • 'laplacian':拉普拉斯滤波器;
  • 'log':高斯-拉普拉斯(LoG)滤波器;
  • 'motion':运动模糊滤波器;
  • 'prewitt':Prewitt 滤波器;
  • 'sobel':Sobel 滤波器

filter函数:是一个二维滤波器函数,用于对图像进行滤波操作。它可以使用用户自定义的滤波器卷积核进行滤波,也可以使用 fspecial 函数生成的预定义滤波器卷积核进行滤波。函数返回一个滤波后的二维数组 B,其大小和形状由参数 shape 决定。可以将 filter2 函数用于图像处理任务,例如平滑、锐化、边缘检测等。需要注意的是,filter2 函数的滤波操作是基于卷积运算实现的,因此需要对输入的图像进行填充,以避免边缘像素的影响。可以使用 MATLAB 中的 padarray 函数对图像进行填充。该函数语法如下

B = filter2(h, A, shape)

其中,参数 h 是一个二维滤波器卷积核,参数 A 是一个需要进行滤波的二维数组(通常是图像),shape 是一个可选参数,用于指定输出数组的大小和形状

  • shapesame时:输出数组的大小与输入数组相同,但是边缘可能会受到卷积核的影响而变化
  • shapefull时:输出数组的大小为输入数组大小与卷积核大小之和减去1,输出数组的边缘受卷积核影响而扩展
  • shapevalid时,输出数组的大小为输入数组大小与卷积核大小之差加1,输出数组的边缘不受卷积核影响

imfilter函数:是一个通用的二维滤波器函数,用于对图像进行滤波操作。它可以使用用户自定义的滤波器卷积核进行滤波,也可以使用 fspecial 函数生成的预定义滤波器卷积核进行滤波。imfilter 函数返回一个滤波后的二维数组 B,其大小和形状由参数 options 决定。可以将 imfilter 函数用于图像处理任务,例如平滑、锐化、边缘检测等。该函数语法如下

B = imfilter(A, h, options)

其中,参数 A 是一个需要进行滤波的二维数组(通常是图像),参数 h 是一个二维滤波器卷积核,options 是一个包含滤波选项的结构体,可选参数包括:

  • 'conv':指定卷积操作;
  • 'corr':指定相关操作;
  • 'same':指定输出大小与输入相同;
  • 'full':指定输出大小为输入大小加上滤波核大小减一;
  • 'valid':指定输出大小为输入大小减去滤波核大小加一;
  • 'replicate':指定用边缘值来填充图像;
  • 'symmetric':指定用对称方式来填充图像;
  • 'circular':指定用循环方式来填充图像

matlab实现

Image=imread('Letters-a.jpg');
noiseI=imnoise(Image,'gaussian');                %添加高斯噪声
subplot(221),imshow(Image),title('原图');
subplot(222),imshow(noiseI),title('高斯噪声图像');
result1=filter2(fspecial('average',3),noiseI);                %3×3均值滤波
result2=filter2(fspecial('average',7),noiseI);                % 7×7均值滤波
subplot(223),imshow(uint8(result1)),title('3×3均值滤波');
subplot(224),imshow(uint8(result2)),title('7×7均值滤波');

Python实现

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

# 读取图像
img = cv2.imread('Letters-a.jpg')

# 添加高斯噪声
noise_img = cv2.GaussianBlur(img, (5, 5), 0)

# 显示原图和噪声图像
plt.subplot(221), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)), plt.title('原图')
plt.subplot(222), plt.imshow(cv2.cvtColor(noise_img, cv2.COLOR_BGR2RGB)), plt.title('高斯噪声图像')

# 3x3均值滤波
result1 = cv2.blur(noise_img, (3, 3))

# 7x7均值滤波
result2 = cv2.blur(noise_img, (7, 7))

# 显示3x3和7x7均值滤波结果
plt.subplot(223), plt.imshow(cv2.cvtColor(result1, cv2.COLOR_BGR2RGB)), plt.title('3×3均值滤波')
plt.subplot(224), plt.imshow(cv2.cvtColor(result2, cv2.COLOR_BGR2RGB)), plt.title('7×7均值滤波')

plt.show()

(2)高斯滤波

A:高斯函数

高斯函数:高斯函数是一种连续的、平滑的、钟形曲线函数,用于表示在统计和概率领域中连续随机变量的概率密度函数。高斯函数在图像处理、信号处理、模式识别、机器学习等领域广泛应用

  • 一维高斯函数 G ( x ) = 1 σ 2 π e − ( x − μ ) 2 2 σ 2 G(x)=\frac{1}{\sigma \sqrt{2 \pi}} e^{-\frac{(x-\mu)^{2}}{2 \sigma^{2}}} G(x)=σ2π 1e2σ2(xμ)2。一维高斯函数的图像是一条钟形曲线,它的峰值位于均值处,随着 x x x增加或减小,函数值逐渐减小,且标准差越大,函数的宽度越大
  • 二维高斯函数 G ( x , y ) = 1 2 π σ x σ y e − ( x − μ x ) 2 2 σ x 2 − ( y − μ y ) 2 2 σ y G(x, y)=\frac{1}{2 \pi \sigma_{x} \sigma_{y}} e^{-\frac{\left(x-\mu_{x}\right)^{2}}{2 \sigma_{x}^{2}}-\frac{\left(y-\mu_{y}\right)^{2}}{2 \sigma_{y}}} G(x,y)=2πσxσy1e2σx2(xμx)22σy(yμy)2。 二维高斯函数的图像是一个二维钟形曲面,它的峰值位于 ( μ x , μ y ) (\mu_x,\mu_y) (μx,μy)处,随着 x x x y y y的增加或减小,函数值逐渐减小,且标准差越大,函数的宽度越大

在图像处理中,二维高斯函数通常用于进行图像平滑处理,即利用高斯函数的低通滤波性质,去除图像中的噪声和细节信息。同时,高斯函数还可以用于图像边缘检测、尺度空间分析等任务

在这里插入图片描述

B:高斯滤波原理

高斯滤波原理:是以某一像素为中心,在它的周围选择一个局部邻域,把邻域内像素的灰度按照高斯正态分布曲线进行统计,分配相应的权值系数,然后将邻域内所有点的加权平均值代替原像素值

g ( x , y ) = ∑ r = − k k ∑ s = − l l f ( x − r , y − s ) H ( r , s ) g(x, y)=\sum_{r=-k}^{k} \sum_{s=-l}^{l} f(x-r, y-s) H(r, s) g(x,y)=r=kks=llf(xr,ys)H(r,s)

如下为典型的高斯模板

在这里插入图片描述

C:程序

在这里插入图片描述


matlab实现

Image=imread('Letters-a.jpg');
sigma1=0.6; sigma2=10; r=3;  % 高斯模板的参数
NoiseI= imnoise(Image,'gaussian'); %加噪
gausFilter1=fspecial('gaussian',[2*r+1 2*r+1],sigma1);  
gausFilter2=fspecial('gaussian',[2*r+1 2*r+1],sigma2);  
result1=imfilter(NoiseI,gausFilter1,'conv');
result2=imfilter(NoiseI,gausFilter2,'conv');
imshow(Image);title('原图');
figure;imshow(NoiseI);title('高斯噪声图像');
figure;imshow(result1);title('sigma1 =0.6高斯滤波');
figure;imshow(result2);title('sigma2 =10高斯滤波');

python实现

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

Image = cv2.imread('Letters-a.jpg')
sigma1 = 0.6
sigma2 = 10
r = 3

NoiseI = cv2.imread('Letters-a.jpg', 0)
NoiseI = cv2.GaussianBlur(NoiseI, (3,3), 0)
NoiseI = cv2.addWeighted(NoiseI, 1.5, NoiseI, -0.5, 0)

gausFilter1 = cv2.getGaussianKernel(2*r+1, sigma1)
gausFilter1 = np.outer(gausFilter1, gausFilter1)

gausFilter2 = cv2.getGaussianKernel(2*r+1, sigma2)
gausFilter2 = np.outer(gausFilter2, gausFilter2)

result1 = cv2.filter2D(NoiseI, -1, gausFilter1)
result2 = cv2.filter2D(NoiseI, -1, gausFilter2)

plt.imshow(cv2.cvtColor(Image, cv2.COLOR_BGR2RGB))
plt.title('原图')
plt.show()

plt.imshow(NoiseI, cmap='gray')
plt.title('高斯噪声图像')
plt.show()

plt.imshow(result1, cmap='gray')
plt.title('sigma1 =0.6高斯滤波')
plt.show()

plt.imshow(result2, cmap='gray')
plt.title('sigma2 =10高斯滤波')
plt.show()

(3)中值滤波

A:中值

中值:一组数 x 1 , x 2 , . . . , x n x_{1},x_{2},...,x_{n} x1,x2,...,xn,把 n n n个数按值的大小顺序排列如下: x i 1 < x i 2 < . . . x i n x_{i_{1}}<x_{i_{2}}<...x_{in} xi1<xi2<...xin,则中值为

y = { x i ( n + 1 2 ) 1 2 [ x i ( n 2 ) + x i ( n 2 + 1 ) ] n 为奇数 n 为偶数 y=\left\{\begin{array}{l}x_{i\left(\frac{n+1}{2}\right)} \\\frac{1}{2}\left[x_{i\left(\frac{n}{2}\right)}+x_{i\left(\frac{n}{2}+1\right)}\right]\end{array}\right. n 为奇数 n 为偶数 y={xi(2n+1)21[xi(2n)+xi(2n+1)]n为奇数n为偶数

B:中值滤波原理

中值滤波原理:噪声的出现,使被处理点像素比周围像素亮(暗)许多。中值滤波则以被处理点为中心,选取一个邻域窗口,窗口内所有点值排序,取中值代替该点值

在这里插入图片描述

C:示例

在这里插入图片描述

D:中值滤波形状

在这里插入图片描述

在这里插入图片描述

E:程序

在这里插入图片描述

medfilt2函数:是MATLAB中的一个二维中值滤波函数,用于对图像进行去噪处理。该函数语法如下

B = medfilt2(A, [M N])
B = medfilt2(A, [M N], 'symmetric')
B = medfilt2(A, [M N], 'indexed', P)

其中

  • A:输入的图像矩阵。
  • [M N]:中值滤波器的大小,其中MN分别表示滤波器在行方向和列方向的大小,必须为奇数,默认为[3 3]
  • 'symmetric':指定对称性边界条件,即对边缘进行反射填充,默认为零填充。
  • 'indexed':指定输入图像的像素值采用整数标识,其中P是一个向量,其长度等于输入图像中可能出现的像素值的数量,向量中的值表示相应像素值的位置

matlab实现

Image=rgb2gray(imread('lotus.bmp'));
noiseI=imnoise(Image,'salt & pepper',0.1);
imshow(noiseI),title('椒盐噪声图像');
result=medfilt2(noiseI);                                 %3×3中值滤波
figure,imshow(uint8(result)),title('3×3中值滤波');

python实现

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

img = cv2.imread('lotus.bmp')
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
noisy_img = cv2.addSaltAndPepper(gray_img, 0.1)
plt.imshow(noisy_img, cmap='gray')
plt.title('椒盐噪声图像')
plt.show()

result = cv2.medianBlur(noisy_img, 3)
plt.imshow(result, cmap='gray')
plt.title('3x3中值滤波')
plt.show()

(4)双边滤波

A:原理

双边滤波:“双边”意味着平滑滤波时不仅考虑邻域内像素的空间邻近性,而且要考虑邻域内像素的灰度相似性

B F [ I ] P = 1 W P ∑ q ∈ S G σ s ( ∥ p − q ∥ ) G σ r ( ∣ I p − I q ∣ ) I q W P = ∑ q ∈ S G σ s ( ∥ p − q ∥ G σ r ( ∣ I p − I q ∣ ) G σ s ( ∥ p − q ∥ ) = e ( ∥ p − q ∣ ) 2 2 σ s 2 G σ r ( ∣ I p − I q ∣ ) = e − ( I p − I q ) 2 2 σ r 2 \begin{array}{c}B F[I]_{P}=\frac{1}{W_{P}} \sum_{q \in S} G_{\sigma_{s}}(\|p-q\|) G_{\sigma_{r}}\left(\left|I_{p}-I_{q}\right|\right) I_{q} \\W_{P}=\sum_{q \in S} G_{\sigma_{s}}\left(\|p-q\| G_{\sigma_{r}}\left(\left|I_{p}-I_{q}\right|\right)\right. \\G_{\sigma_{s}}(\|p-q\|)=e^{\frac{(\| p-q \mid)^{2}}{2 \sigma_{s}^{2}}} G_{\sigma_{r}}\left(\left|I_{p}-I_{q}\right|\right)=e^{-\frac{\left(I_{p}-I_{q}\right)^{2}}{2 \sigma_{r}^{2}}}\end{array} BF[I]P=WP1qSGσs(pq)Gσr(IpIq)IqWP=qSGσs(pqGσr(IpIq)Gσs(pq)=e2σs2(pq)2Gσr(IpIq)=e2σr2(IpIq)2

B:程序

在这里插入图片描述

matlab实现

Image=im2double(imread('girl.bmp'));  
NoiseI= Image+0.05*randn(size(Image)); 
w=15;       % 定义双边滤波窗口宽度  
sigma_s=6; sigma_r=0.1; % 双边滤波的两个标准差参数  
[X,Y] = meshgrid(-w:w,-w:w); 
Gs = exp(-(X.^2+Y.^2)/(2*sigma_s^2));%计算邻域内的空间权值
[hm,wn] = size(NoiseI); 
result=zeros(hm,wn); 
for i=1:hm    
    for j=1:wn  
        temp=NoiseI(max(i-w,1):min(i+w,hm),max(j-w,1):min(j+w,wn));
        Gr = exp(-(temp-NoiseI(i,j)).^2/(2*sigma_r^2));%计算灰度邻近权值        
        % W为空间权值Gs和灰度权值Gr的成绩       
        W = Gr.*Gs((max(i-w,1):min(i+w,hm))-i+w+1,(max(j-w,1):min(j+w,wn))-j+w+1);      
        result(i,j)=sum(W(:).*temp(:))/sum(W(:));            
    end
end  
subplot(1,3,1),imshow(Image),title('原始图像');  
subplot(1,3,2),imshow(NoiseI),title('随机噪声图像');   
subplot(1,3,3),imshow(result),title('双边滤波图像'); 

python实现

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

# 读取图像并将像素值转换为浮点数
Image = cv2.imread('girl.bmp', cv2.IMREAD_GRAYSCALE)
Image = cv2.normalize(Image.astype('float'), None, 0.0, 1.0, cv2.NORM_MINMAX)

# 添加高斯噪声
NoiseI = Image + 0.05 * np.random.randn(*Image.shape)

# 双边滤波
w = 15
sigma_s = 6
sigma_r = 0.1
X, Y = np.meshgrid(np.arange(-w, w+1), np.arange(-w, w+1))

# 计算邻域内的空间权值
Gs = np.exp(-(X**2 + Y**2) / (2 * sigma_s**2))

hm, wn = NoiseI.shape
result = np.zeros((hm, wn))

for i in range(hm):
    for j in range(wn):
        # 取出当前像素的邻域
        temp = NoiseI[max(i-w, 0):min(i+w, hm), max(j-w, 0):min(j+w, wn)]
        
        # 计算灰度邻近权值
        Gr = np.exp(-(temp - NoiseI[i, j])**2 / (2 * sigma_r**2))
        
        # W 为空间权值 Gs 和灰度权值 Gr 的乘积
        W = Gr * Gs[max(i-w, 0):min(i+w, hm)-i+w+1, max(j-w, 0):min(j+w, wn)-j+w+1]
        
        # 对 W 和邻域内像素值的乘积求和并除以 W 的和,得到当前像素的值
        result[i, j] = np.sum(W * temp) / np.sum(W)

# 显示图像
plt.subplot(1, 3, 1)
plt.imshow(Image, cmap='gray')
plt.title('原始图像')

plt.subplot(1, 3, 2)
plt.imshow(NoiseI, cmap='gray')
plt.title('随机噪声图像')

plt.subplot(1, 3, 3)
plt.imshow(result, cmap='gray')
plt.title('双边滤波图像')

plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/453951.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

203、【栈与队列】leetcode ——剑指 Offer II 040. 矩阵中最大的矩形 / 85. 最大矩形:暴力+单调栈(C++/Pyhont版本)

题目描述 Problem: 剑指 Offer II 040. 矩阵中最大的矩形 文章目录 题目描述解法一&#xff1a;暴力解法思路解题方法复杂度Code 解法二&#xff1a;单调栈解法 解法一&#xff1a;暴力解法 思路 首先&#xff0c; 按行获取到达某一元素位置时&#xff0c;之前与当前连续1的个…

【JUC高并发编程】—— 初见JUC

一、JUC 概述 什么是JUC JUC 是 Java并发编程的缩写&#xff0c;指的是 Java.util.concurrent 即Java工具集下的并发编程库 【说白了就是处理线程的工具包】 JUC提供了一套并发编程工具&#xff0c;这些工具是Java 5以后引入的&#xff0c;使得Java开发者可以更加方便地编写…

86页2023年新型智慧城市顶层设计规划解决方案(ppt可编辑)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除 整体架构 智慧城市建设从顶层设计入手&#xff0c;结合软硬件资源整合能力&#xff0c;为公众提供全生命周期一站式服务管理。智慧城市的整体框架分为发展战略层、技术实施层…

HuggingFace入门教程--环境搭建

HuggingFace中文直译为”拥抱脸“&#xff0c;是最近非常火爆的一个人工智能社区&#xff0c;官网地址是&#xff1a;https://huggingface.co/ .关于HuggingFace的相关介绍大家可以自行百度。本文主要为刚入人工智能坑的小白指下路&#xff0c;同时也是逼着自己记录下学习过程中…

Cuckoo Filter

其他判重数据结构 Bloom Filter 无法支持删除和计数的功能&#xff0c;需要更多的存储空间来存储数据 因为在CS中&#xff0c;删除和计数是常见的操作&#xff0c;但是这会对布隆过滤器的存储空间产生影响&#xff0c;同样为了实现这一操作&#xff0c;需要更多的存储空间 数…

vue---父子、兄弟、跨层级关系组件通信

目录 1、props / $emit &#xff08;父子通信&#xff09; 2、$root、 $parent / $children(vue3废弃) 3、ref/$refs 4、EventBus &#xff08;$emit / $on&#xff09; 5、provideinject&#xff08;依赖注入&#xff09; 6、$attrs $listeners&#xff08;透传&#x…

电子政务网络智慧运维方案

随着电子政务建设的深入&#xff0c;我国政府的信息化建设已经具备了一定的规模&#xff0c;形成了部、省、市、县四级体系&#xff1b;大型政务服务事项、公文流转、行政审批、费税征缴、信息公开、网格化社会管理、三网融合、智慧城市建设等大量政府核心业务越来越依赖信息化…

Linux 静态库的制作与使用

目录 静态库1、 什么是库2、 静态库的制作2.1 命名规则与制作规则 3、 静态库的使用 静态库 1、 什么是库 库文件是计算机上的一类文件&#xff0c;可以简单的把库文件看成一种代码仓库&#xff0c;它提供使用者可以直接拿来用的变量、函数或类。库是一种特殊的程序&#xff…

atbetaflight——指定commit号编译固件

一、说明 在开发过程中&#xff0c;比如成员A上传了一次code,而成员B需要测试本次提交的code&#xff0c;但是由于没有搭建ci,成员B就需要自己拉code编译&#xff0c;本文将详细说明编译步骤&#xff1b; 二、步骤 1、使用vscode打开code 在使用git clone下载到code后的文件…

HDCTF2023复盘

文章目录 前言 CryptoNormal_rsaNormal_rsa(Revenge)(低指数e攻击)Math_RSA(二次剩余)爬过小山的看云(hill,云影) MischardMisc(base64)MasterMisc(crc,wav)ExtremeMisc(zip爆破,明文攻击) Reverseeasy_re(Upx,base64)easyasm(xor) WebWelcome To HDCTF 2023(JSFuck)SearchMast…

『C++』异常详解

「前言」文章是关于C异常方面&#xff0c;下面开始讲解 「归属专栏」C嘎嘎 「笔者」枫叶先生(fy) 「座右铭」前行路上修真我 「枫叶先生有点文青病」 「每篇一句」 少年的肩膀&#xff0c;就该这样才对嘛&#xff0c; 什么都不要急&#xff0c; 先挑起清风明月、杨柳依依和草长…

华为OD机试真题(Java),吃到最多的刚好合适的菜(100%通过+复盘思路)

一、题目描述 入职后&#xff0c;导师会请你吃饭&#xff0c;你选择了火锅。 火锅里会在不同时间下很多菜。 不同食材要煮不同的时间&#xff0c;才能变得刚好合适。你希望吃到最多的刚好合适的菜&#xff0c;但你的手速不够快&#xff0c;用m代表手速&#xff0c;每次下手捞…

作业3综合练习

综合练习: 要求&#xff1a;请给openlab搭建web网站 网站需求: 1.基于域名www.openlab.com可以访问网站内容为 welcome to openlab!!! 2.给该公司创建三个子界面分别显示学生信息,教学资料和缴费网站,基于www.openlab.com/student #更改配置文件 &#xff08;虚拟主机标签…

嵌入式51单片机04-矩阵按键系列

文章目录 矩阵按键一、矩阵按键基础知识二、矩阵按键系列代码1. 矩阵按键操作&#xff08;显示数字&#xff09;&#xff08;1&#xff09;仿真电路图&#xff08;2&#xff09;源代码&#xff08;3&#xff09;实验结果 2. 矩阵按键操作&#xff08;控制数码管&#xff09;&am…

STM32的GPIO重映射配置(解除下载端口的重映射)

在设计一个项目的时候&#xff0c;因为用的是STMF103C8T6&#xff0c;引脚较少&#xff0c;所以把可以用的GPIO都需要用上&#xff0c;但是由于下载的引脚在出生时&#xff0c;被厂家已经配置好了&#xff0c;所以我们得利用软件配置一下&#xff0c;使引脚变成正常的GPIO。 手…

安卓12源码编译错误-java.lang.OutOfMemoryError: Java heap space

报错如下&#xff1a; FAILED: out/soong/.intermediates/frameworks/base/module-lib-api-stubs-docs-non-updatable/android_common/metalava/api_lint.timestamp out/soong/.intermediates/frameworks/base/module-lib-api-stubs-docs-non-updatable/android_common/metala…

Flutter开发日常练习-小猫咪杂货店(新增动画和跳转抖音)

之前的练习加了个详情页面,然后跳转第三方页面抖音用户详情页面 跳转详情页添加了Hero的动画,共享元素过度 一个 标准 hero 动画 使 hero 从一页飞至新页面&#xff0c;通常以不同大小到达不同的目的地。 设定好每个图片的id,通过id作为 Hero 组件的标识,id不能重,否则会报错&…

DHCP笔记

目录 DHCP动态主机配置协议——UDP67/68端口 DHCP获取IP地址 客户端首次获取IP地址 客户端再次获取IP地址 租期/续租 DHCP的工作报文 DHCP的配置 案例 DHCP动态主机配置协议——UDP67/68端口 DHCP是应用层协议&#xff0c;采用C/S服务模式&#xff0c;只能在一个广播域…

TortoiseSVN使用-授权访问

文章目录 3.4.6 授权访问 3.4.6 授权访问 总结&#xff1a; 如果是匿名访问&#xff08;就是不用输入用户名密码的访问方式&#xff09;&#xff0c;请只开启anon-access write如果授权访问&#xff0c;请先设置anon-access none&#xff0c;然后打开3个&#xff1a;auth-a…

C++ “类与对象”

类与对象的概念 类相当于是结构体的声明&#xff0c;是结构体的设计图&#xff0c;而对象是利用设计图的创造的产物. &#xff08;1&#xff09;.类的大小计算 类的大小计算时与结构体类似&#xff0c;但函数是不计入大小的&#xff08;函数放在单独的公共空间&#xff09;. 在…