圖像平滑(Image Smoothing):是一種數(shù)字圖像處理技術(shù),用于減少圖像中的噪聲和不規(guī)則性,使圖像更加平滑和連續(xù)。在圖像中,噪聲通常表現(xiàn)為不規(guī)則的、突出的像素值,這可能會(huì)導(dǎo)致圖像細(xì)節(jié)丟失,使其難以進(jìn)行分析和處理。圖像平滑技術(shù)可以通過對(duì)像素值進(jìn)行濾波來平滑圖像,去除這些噪聲
圖像平滑主要分為如下兩類
- 空域法: 主要借助模板運(yùn)算,在像素點(diǎn)鄰域內(nèi),利用噪聲像素點(diǎn)特性進(jìn)行濾波
- 頻域法: 指對(duì)圖像進(jìn)行正交變換,利用噪聲對(duì)應(yīng)高頻信息的特點(diǎn)進(jìn)行濾波
一:圖像中的噪聲
圖像中的噪聲:是指在圖像中出現(xiàn)的不希望出現(xiàn)的、隨機(jī)的像素值變化,這些變化可能是由于圖像采集設(shè)備、傳輸通道或者圖像處理過程中引入的。噪聲會(huì)使圖像中出現(xiàn)不規(guī)則的亮度、色彩等異常情況,從而導(dǎo)致圖像質(zhì)量下降,給后續(xù)的分析和處理帶來困難。也可以理解為真實(shí)信號(hào)與理想信號(hào)之間存在的偏差。噪聲通常以二維函數(shù) n ( x , y ) n(x,y) n(x,y)來表示
(1)圖像噪聲分類
圖像噪聲分類:
- 高斯噪聲: 高斯噪聲是最常見的一種圖像噪聲,其像素值變化符合正態(tài)分布。在圖像中,高斯噪聲通常表現(xiàn)為細(xì)小的均勻噪聲
- 椒鹽噪聲: 椒鹽噪聲是一種隨機(jī)的噪聲,其表現(xiàn)為圖像中出現(xiàn)黑白像素點(diǎn),通常是由于圖像傳輸或采集設(shè)備的問題引起的
- 周期噪聲: 周期噪聲是指在圖像中出現(xiàn)周期性的波紋、條紋等形式的噪聲,這通常是由于攝像機(jī)、掃描儀等采集設(shè)備的問題引起的
- 色彩噪聲: 色彩噪聲是指在圖像中出現(xiàn)的顏色偏差,這通常是由于相機(jī)傳感器的顏色誤差、照明條件不足等原因引起的
另外,圖像噪聲可以根據(jù)信號(hào)和噪聲的關(guān)系分為
- 加性噪聲: 加性噪聲與圖像信號(hào)不相關(guān),也即 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)
- 乘性噪聲: 乘性噪聲與圖像信號(hào)相關(guān),也即 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)
在信號(hào)變化很小時(shí),往往將乘性噪聲近似認(rèn)為加性噪聲,而且總是假定信號(hào)和噪聲互相獨(dú)立
(2)圖像噪聲的數(shù)學(xué)模型
高斯噪聲:定義為高斯噪聲信號(hào) x x x的概率密度函數(shù)
- μ \mu μ:噪聲 x x x的均值或期望值
- σ \sigma σ:噪聲 x x x的標(biāo)準(zhǔn)差
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π?σ1?e?(x?μ)2/2σ2
當(dāng)
x
x
x服從高斯分布時(shí),其值有70%落在
[
(
μ
?
σ
)
,
(
μ
+
σ
)
]
[(\mu-\sigma),(\mu+\sigma)]
[(μ?σ),(μ+σ)]范圍內(nèi),且有95%落在
[
(
μ
?
2
σ
)
,
(
μ
+
2
σ
)
]
[(\mu-2\sigma),(\mu+2\sigma)]
[(μ?2σ),(μ+2σ)]
椒鹽噪聲:定義椒鹽噪聲信號(hào) 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_ & x=b \\0 & \text { otherwise }\end{array}\right. p(x)=? ? ??Pa?Pb?0?x=ax=b?otherwise??
如下圖
- 當(dāng) P a = 0 , P b =? 0 P_{a}=0,P_ \not=0 Pa?=0,Pb?=0時(shí),表現(xiàn)為“鹽”噪聲
- 當(dāng) P a =? 0 , P b = 0 P_{a}\not=0,P_ =0 Pa?=0,Pb?=0時(shí),表現(xiàn)為“胡椒”噪聲
可以看出,高斯噪聲和椒鹽噪聲不同分布特性
- 椒鹽噪聲:噪聲幅值基本相同,出現(xiàn)位置隨機(jī)
- 高斯噪聲:噪聲出現(xiàn)位置是分布在每一像素 點(diǎn)上,幅度值是隨機(jī)的,分布近似符合高斯 正態(tài)特性
(3)程序
imnoise
函數(shù):用于在圖像中添加噪聲的函數(shù),可以模擬在圖像采集、傳輸、處理等過程中引入的不同類型的噪聲。imnoise函數(shù)的常見語(yǔ)法格式如下
J = imnoise(I, type)
J = imnoise(I, type, parameters)
其中,I
是輸入圖像,type
是噪聲類型,可以是字符串形式的字符向量或枚舉型變量,parameters
是可選的參數(shù),用于控制噪聲的強(qiáng)度、分布等。imnoise函數(shù)支持以下類型的噪聲
-
gaussian
:高斯噪聲,可選參數(shù)包括mean(均值)和var(方差) -
salt & pepper
:椒鹽噪聲,可選參數(shù)包括density(密度) -
poisson
:泊松噪聲,無可選參數(shù) -
speckle
:乘性噪聲,可選參數(shù)包括mean(均值)和var(方差) -
localvar
:局部方差噪聲,可選參數(shù)包括二維數(shù)組w(窗口大?。┖投S數(shù)組var(局部方差) -
lognormal
:對(duì)數(shù)正態(tài)分布噪聲,可選參數(shù)包括mean(均值)和var(方差) -
rayleigh
:瑞利分布噪聲,可選參數(shù)為scale(尺度) -
erlang
:伽馬分布噪聲,可選參數(shù)包括shape(形狀)和scale(尺度) -
uniform
:均勻分布噪聲,可選參數(shù)包括lower(下限)和upper(上限)
matlab實(shí)現(xiàn):文章來源:http://www.zghlxwxcb.cn/news/detail-423382.html
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'); %添加高斯噪聲,默認(rèn)均值為0,方差為0.01
figure;imshow(noiseIg,[0 1]); title('高斯噪聲圖像');
Python實(shí)現(xiàn):
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 讀取圖像
img = cv2.imread('original_pattern.jpg', cv2.IMREAD_GRAYSCALE)
# 將圖像歸一化到 [0,1] 范圍內(nèi)
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()
# 添加高斯噪聲,默認(rèn)均值為 0,方差為 0.01
noiseIg = cv2.randn(img.shape, 0, 0.01)
noiseIg = cv2.add(img, noiseIg)
# 將圖像歸一化到 [0,1] 范圍內(nèi)
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()
二:空間域平滑濾波
空間域平滑濾波:是數(shù)字圖像處理中常用的一種濾波方法,也被稱為模糊濾波。它通過對(duì)圖像像素周圍一定大小的鄰域內(nèi)像素灰度值進(jìn)行加權(quán)平均,以消除圖像中的高頻噪聲和細(xì)節(jié)信息,從而使圖像變得更加平滑。常見有以下幾種
- 均值濾波
- 高斯濾波
- 中值濾波
- 雙邊濾波
(1)均值濾波
A:均值濾波原理
均值濾波:是以某一像素為中心,在它的周圍選擇一鄰域,將鄰域內(nèi)所有點(diǎn)的均值(灰度值相加求平均)來代替原來像素值
- S S S:以點(diǎn) ( x , y ) (x,y) (x,y)為中心的鄰域
- M M M:領(lǐng)域 S S S內(nèi)總像素?cái)?shù)目
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)∈S∑?f(m,n)
如下為常用的線性平滑簡(jiǎn)單均值模板
B:示例
如下圖
C:分析
均值濾波的優(yōu)點(diǎn)是簡(jiǎn)單易實(shí)現(xiàn),對(duì)于一些噪聲較小的圖像能夠取得不錯(cuò)的平滑效果。但是,它也存在一些缺點(diǎn)。例如,它會(huì)對(duì)圖像中的邊緣和細(xì)節(jié)信息造成模糊,同時(shí)也可能使得一些噪聲點(diǎn)變得更加明顯。此外,均值濾波對(duì)于椒鹽噪聲等高斯分布以外的噪聲類型效果較差
- 若鄰域內(nèi)存在噪聲,經(jīng)過平均,噪聲幅度會(huì)大為降低
- 點(diǎn)與點(diǎn)之間的灰度差值變小,邊緣和細(xì)節(jié)處變得模糊
- 鄰域半徑越大,圖像模糊程度越厲害
D:程序
fspecial
函數(shù):用于生成一些常見的濾波器卷積核的函數(shù)。這些卷積核可以用于各種圖像處理任務(wù),例如平滑、銳化、邊緣檢測(cè)等。fspecial
函數(shù)返回一個(gè)二維的卷積核矩陣 H
,該矩陣的大小和形狀由參數(shù) type
和可選參數(shù)決定??梢詫⒃摼矸e核作為參數(shù)傳遞給 MATLAB 中的卷積函數(shù),如 conv2
函數(shù),對(duì)圖像進(jìn)行濾波操作。該函數(shù)語(yǔ)法如下
H = fspecial(type, varargin)
其中,參數(shù) type
指定了要生成的卷積核的類型。type
可以取以下字符串值:
-
'average'
:平均濾波器; -
'disk'
:圓形平滑濾波器; -
'gaussian'
:高斯濾波器; -
'laplacian'
:拉普拉斯濾波器; -
'log'
:高斯-拉普拉斯(LoG)濾波器; -
'motion'
:運(yùn)動(dòng)模糊濾波器; -
'prewitt'
:Prewitt 濾波器; -
'sobel'
:Sobel 濾波器
filter
函數(shù):是一個(gè)二維濾波器函數(shù),用于對(duì)圖像進(jìn)行濾波操作。它可以使用用戶自定義的濾波器卷積核進(jìn)行濾波,也可以使用 fspecial
函數(shù)生成的預(yù)定義濾波器卷積核進(jìn)行濾波。函數(shù)返回一個(gè)濾波后的二維數(shù)組 B
,其大小和形狀由參數(shù) shape
決定??梢詫?filter2
函數(shù)用于圖像處理任務(wù),例如平滑、銳化、邊緣檢測(cè)等。需要注意的是,filter2
函數(shù)的濾波操作是基于卷積運(yùn)算實(shí)現(xiàn)的,因此需要對(duì)輸入的圖像進(jìn)行填充,以避免邊緣像素的影響??梢允褂?MATLAB 中的 padarray
函數(shù)對(duì)圖像進(jìn)行填充。該函數(shù)語(yǔ)法如下
B = filter2(h, A, shape)
其中,參數(shù) h
是一個(gè)二維濾波器卷積核,參數(shù) A
是一個(gè)需要進(jìn)行濾波的二維數(shù)組(通常是圖像),shape
是一個(gè)可選參數(shù),用于指定輸出數(shù)組的大小和形狀
- 當(dāng)
shape
為same
時(shí):輸出數(shù)組的大小與輸入數(shù)組相同,但是邊緣可能會(huì)受到卷積核的影響而變化 - 當(dāng)
shape
為full
時(shí):輸出數(shù)組的大小為輸入數(shù)組大小與卷積核大小之和減去1,輸出數(shù)組的邊緣受卷積核影響而擴(kuò)展 - 當(dāng)
shape
為valid
時(shí),輸出數(shù)組的大小為輸入數(shù)組大小與卷積核大小之差加1,輸出數(shù)組的邊緣不受卷積核影響
imfilter
函數(shù):是一個(gè)通用的二維濾波器函數(shù),用于對(duì)圖像進(jìn)行濾波操作。它可以使用用戶自定義的濾波器卷積核進(jìn)行濾波,也可以使用 fspecial
函數(shù)生成的預(yù)定義濾波器卷積核進(jìn)行濾波。imfilter
函數(shù)返回一個(gè)濾波后的二維數(shù)組 B
,其大小和形狀由參數(shù) options
決定??梢詫?imfilter
函數(shù)用于圖像處理任務(wù),例如平滑、銳化、邊緣檢測(cè)等。該函數(shù)語(yǔ)法如下
B = imfilter(A, h, options)
其中,參數(shù) A
是一個(gè)需要進(jìn)行濾波的二維數(shù)組(通常是圖像),參數(shù) h
是一個(gè)二維濾波器卷積核,options
是一個(gè)包含濾波選項(xiàng)的結(jié)構(gòu)體,可選參數(shù)包括:
-
'conv'
:指定卷積操作; -
'corr'
:指定相關(guān)操作; -
'same'
:指定輸出大小與輸入相同; -
'full'
:指定輸出大小為輸入大小加上濾波核大小減一; -
'valid'
:指定輸出大小為輸入大小減去濾波核大小加一; -
'replicate'
:指定用邊緣值來填充圖像; -
'symmetric'
:指定用對(duì)稱方式來填充圖像; -
'circular'
:指定用循環(huán)方式來填充圖像
matlab實(shí)現(xiàn):
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實(shí)現(xiàn):
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均值濾波結(jié)果
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:高斯函數(shù)
高斯函數(shù):高斯函數(shù)是一種連續(xù)的、平滑的、鐘形曲線函數(shù),用于表示在統(tǒng)計(jì)和概率領(lǐng)域中連續(xù)隨機(jī)變量的概率密度函數(shù)。高斯函數(shù)在圖像處理、信號(hào)處理、模式識(shí)別、機(jī)器學(xué)習(xí)等領(lǐng)域廣泛應(yīng)用
- 一維高斯函數(shù): 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π?1?e?2σ2(x?μ)2?。一維高斯函數(shù)的圖像是一條鐘形曲線,它的峰值位于均值處,隨著 x x x增加或減小,函數(shù)值逐漸減小,且標(biāo)準(zhǔn)差越大,函數(shù)的寬度越大
- 二維高斯函數(shù): 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?σy?1?e?2σx2?(x?μx?)2??2σy?(y?μy?)2?。 二維高斯函數(shù)的圖像是一個(gè)二維鐘形曲面,它的峰值位于 ( μ x , μ y ) (\mu_x,\mu_y) (μx?,μy?)處,隨著 x x x或 y y y的增加或減小,函數(shù)值逐漸減小,且標(biāo)準(zhǔn)差越大,函數(shù)的寬度越大
在圖像處理中,二維高斯函數(shù)通常用于進(jìn)行圖像平滑處理,即利用高斯函數(shù)的低通濾波性質(zhì),去除圖像中的噪聲和細(xì)節(jié)信息。同時(shí),高斯函數(shù)還可以用于圖像邊緣檢測(cè)、尺度空間分析等任務(wù)
B:高斯濾波原理
高斯濾波原理:是以某一像素為中心,在它的周圍選擇一個(gè)局部鄰域,把鄰域內(nèi)像素的灰度按照高斯正態(tài)分布曲線進(jìn)行統(tǒng)計(jì),分配相應(yīng)的權(quán)值系數(shù),然后將鄰域內(nèi)所有點(diǎn)的加權(quán)平均值代替原像素值
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=?k∑k?s=?l∑l?f(x?r,y?s)H(r,s)
如下為典型的高斯模板
C:程序
matlab實(shí)現(xiàn):
Image=imread('Letters-a.jpg');
sigma1=0.6; sigma2=10; r=3; % 高斯模板的參數(shù)
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實(shí)現(xiàn):
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:中值
中值:一組數(shù) x 1 , x 2 , . . . , x n x_{1},x_{2},...,x_{n} x1?,x2?,...,xn?,把 n n n個(gè)數(shù)按值的大小順序排列如下: 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 為奇數(shù) n 為偶數(shù) 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 為奇數(shù) n 為偶數(shù) y={xi(2n+1?)?21?[xi(2n?)?+xi(2n?+1)?]?n為奇數(shù)n為偶數(shù)
B:中值濾波原理
中值濾波原理:噪聲的出現(xiàn),使被處理點(diǎn)像素比周圍像素亮(暗)許多。中值濾波則以被處理點(diǎn)為中心,選取一個(gè)鄰域窗口,窗口內(nèi)所有點(diǎn)值排序,取中值代替該點(diǎn)值
C:示例
D:中值濾波形狀
E:程序
medfilt2
函數(shù):是MATLAB中的一個(gè)二維中值濾波函數(shù),用于對(duì)圖像進(jìn)行去噪處理。該函數(shù)語(yǔ)法如下
B = medfilt2(A, [M N])
B = medfilt2(A, [M N], 'symmetric')
B = medfilt2(A, [M N], 'indexed', P)
其中
-
A
:輸入的圖像矩陣。 -
[M N]
:中值濾波器的大小,其中M
和N
分別表示濾波器在行方向和列方向的大小,必須為奇數(shù),默認(rèn)為[3 3]
。 -
'symmetric'
:指定對(duì)稱性邊界條件,即對(duì)邊緣進(jìn)行反射填充,默認(rèn)為零填充。 -
'indexed'
:指定輸入圖像的像素值采用整數(shù)標(biāo)識(shí),其中P
是一個(gè)向量,其長(zhǎng)度等于輸入圖像中可能出現(xiàn)的像素值的數(shù)量,向量中的值表示相應(yīng)像素值的位置
matlab實(shí)現(xiàn):
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實(shí)現(xiàn):
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:原理
雙邊濾波:“雙邊”意味著平滑濾波時(shí)不僅考慮鄰域內(nèi)像素的空間鄰近性,而且要考慮鄰域內(nèi)像素的灰度相似性
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?=WP?1?∑q∈S?Gσs??(∥p?q∥)Gσr??(∣Ip??Iq?∣)Iq?WP?=∑q∈S?Gσs??(∥p?q∥Gσr??(∣Ip??Iq?∣)Gσs??(∥p?q∥)=e2σs2?(∥p?q∣)2?Gσr??(∣Ip??Iq?∣)=e?2σr2?(Ip??Iq?)2??
B:程序
matlab實(shí)現(xiàn):
Image=im2double(imread('girl.bmp'));
NoiseI= Image+0.05*randn(size(Image));
w=15; % 定義雙邊濾波窗口寬度
sigma_s=6; sigma_r=0.1; % 雙邊濾波的兩個(gè)標(biāo)準(zhǔn)差參數(shù)
[X,Y] = meshgrid(-w:w,-w:w);
Gs = exp(-(X.^2+Y.^2)/(2*sigma_s^2));%計(jì)算鄰域內(nèi)的空間權(quán)值
[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));%計(jì)算灰度鄰近權(quán)值
% W為空間權(quán)值Gs和灰度權(quán)值Gr的成績(jī)
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('隨機(jī)噪聲圖像');
subplot(1,3,3),imshow(result),title('雙邊濾波圖像');
python實(shí)現(xiàn):文章來源地址http://www.zghlxwxcb.cn/news/detail-423382.html
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 讀取圖像并將像素值轉(zhuǎn)換為浮點(diǎn)數(shù)
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))
# 計(jì)算鄰域內(nèi)的空間權(quán)值
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):
# 取出當(dāng)前像素的鄰域
temp = NoiseI[max(i-w, 0):min(i+w, hm), max(j-w, 0):min(j+w, wn)]
# 計(jì)算灰度鄰近權(quán)值
Gr = np.exp(-(temp - NoiseI[i, j])**2 / (2 * sigma_r**2))
# W 為空間權(quán)值 Gs 和灰度權(quán)值 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]
# 對(duì) W 和鄰域內(nèi)像素值的乘積求和并除以 W 的和,得到當(dāng)前像素的值
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('隨機(jī)噪聲圖像')
plt.subplot(1, 3, 3)
plt.imshow(result, cmap='gray')
plt.title('雙邊濾波圖像')
plt.show()
到了這里,關(guān)于(數(shù)字圖像處理MATLAB+Python)第六章圖像平滑-第一節(jié):圖像平滑概述和空間域平滑濾波的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!