?博客主頁:王樂予??
?年輕人要:Living for the moment(活在當(dāng)下)!??
??推薦專欄:【圖像處理】【千錘百煉Python】【深度學(xué)習(xí)】【排序算法】
本節(jié)將對經(jīng)過噪聲污染的圖像進行去噪,去噪方法包含均值濾波、中值濾波、方框濾波、雙邊濾波和高斯濾波。
??一、引言
??1.1 圖像用例
實驗所用的圖像為【OpenCV-Python】:對圖像添加高斯噪聲與椒鹽噪聲中得到的均值為0,方差為0.01的高斯噪聲污染圖像和噪聲密度為0.05的椒鹽噪聲污染圖像,如圖所示:
??1.2 評價指標
為了評判去噪質(zhì)量的好壞,我們將選取PSNR、SSIM和MSE作為評價指標!
評價指標見:【OpenCV-Python】:圖像PSNR、SSIM、MSE計算
??1.3 定義圖像質(zhì)量評價函數(shù)
def compare(ori, gaussian_denosing, sp_denosing):
# ori為原圖(未被噪聲污染的圖),gaussian_denosing為經(jīng)過高斯噪聲污染的圖通過去噪算法去噪后的圖;sp_denosing為經(jīng)過椒鹽噪聲污染的圖通過去噪算法去噪后的圖
gaussian_psnr = compare_psnr(ori, gaussian_denosing)
sp_psnr = compare_psnr(ori, sp_denosing)
gaussian_ssim = compare_ssim(ori, gaussian_denosing, multichannel=True)
sp_ssim = compare_ssim(ori, sp_denosing, multichannel=True)
gaussian_mse = compare_mse(ori, gaussian_denosing)
sp_mse = compare_mse(ori, sp_denosing)
return gaussian_psnr, sp_psnr, gaussian_ssim, sp_ssim, gaussian_mse, sp_mse
??二、均值濾波
??2.1 濾波原理
均值濾波也稱線性濾波,它是指使用一個模板在原圖上進行均值計算并替換原圖的值。
均值濾波器的模板有標準像素平均和加權(quán)平均之分,一個
3
×
3
3×3
3×3大小的模板如下圖所示:
??2.2 實驗過程
使用函數(shù):cv2.blur()
??2.2.1 程序設(shè)計
"""
均值濾波
"""
gaussian_blur = cv2.blur(gaussian_img, (3, 3))
sp_blur = cv2.blur(sp_img, (3, 3))
h1 = np.hstack([gaussian_img, gaussian_blur])
h2 = np.hstack([sp_img, sp_blur])
v = np.vstack([h1, h2])
cv2.imshow('out', v)
cv2.waitKey()
??2.2.2 實驗結(jié)果
- 第一幅圖為被高斯噪聲污染的圖像;
- 第二幅圖為使用均值濾波對第一幅圖去噪后的圖像;
- 第三幅圖為被椒鹽噪聲污染的圖像;
- 第四幅圖為使用均值濾波對第三幅圖去噪后的圖像。
??2.2.3 指標參數(shù)
gaussian_psnr, sp_psnr, gaussian_ssim, sp_ssim, gaussian_mse, sp_mse = compare(original, gaussian_blur, sp_blur)
print('均值濾波對高斯噪聲污染圖像去噪后的指標為:PSNR:{},SSIM:{},MSE:{}'.format(gaussian_psnr, gaussian_ssim, gaussian_mse))
print('均值濾波對椒鹽噪聲污染圖像去噪后的指標為:PSNR:{},SSIM:{},MSE:{}'.format(sp_psnr, sp_ssim, sp_mse))
結(jié)果為:
均值濾波對高斯噪聲污染圖像去噪后的指標為:PSNR:27.51495578617511,SSIM:0.7044879580272968,MSE:115.23509979248047
均值濾波對椒鹽噪聲污染圖像去噪后的指標為:PSNR:25.66665449076371,SSIM:0.5821969899711158,MSE:176.36601893107095
從指標結(jié)果可以看出,均值濾波對高斯噪聲的去除能力更強!
??三、中值濾波
??3.1 濾波原理
中值濾波是把圖像中的一點用該點的一個鄰域中的各值的中值代替。
??3.2 實驗過程
使用函數(shù):cv2.medianBlur()
??3.2.1 程序設(shè)計
gaussian_blur = cv2.medianBlur(gaussian_img, (3, 3))
sp_blur = cv2.medianBlur(sp_img, (3, 3))
h1 = np.hstack([gaussian_img, gaussian_blur])
h2 = np.hstack([sp_img, sp_blur])
v = np.vstack([h1, h2])
cv2.imwrite(r"C:\Users\Lenovo\Desktop\DIP\median_filter.jpg", v)
cv2.imshow('out', v)
cv2.waitKey()
??3.2.2 實驗結(jié)果
- 第一幅圖為被高斯噪聲污染的圖像;
- 第二幅圖為使用中值濾波對第一幅圖去噪后的圖像;
- 第三幅圖為被椒鹽噪聲污染的圖像;
- 第四幅圖為使用中值濾波對第三幅圖去噪后的圖像。
??3.2.3 指標參數(shù)
gaussian_psnr, sp_psnr, gaussian_ssim, sp_ssim, gaussian_mse, sp_mse = compare(original, gaussian_blur, sp_blur)
print('中值濾波對高斯噪聲污染圖像去噪后的指標為:PSNR:{},SSIM:{},MSE:{}'.format(gaussian_psnr, gaussian_ssim, gaussian_mse))
print('中值濾波對椒鹽噪聲污染圖像去噪后的指標為:PSNR:{},SSIM:{},MSE:{}'.format(sp_psnr, sp_ssim, sp_mse))
結(jié)果為:
中值濾波對高斯噪聲污染圖像去噪后的指標為:PSNR:26.882078435438537,SSIM:0.6406334892144118,MSE:133.31300481160483
中值濾波對椒鹽噪聲污染圖像去噪后的指標為:PSNR:28.5392567826037,SSIM:0.7218574470291008,MSE:91.0237414042155
從指標結(jié)果可以看出,中值濾波對椒鹽噪聲的去除能力更強!
??四、方框濾波
??4.1 濾波原理
方框濾波又稱盒子濾波,方框濾波中可以自由選擇是否對均值濾波的結(jié)果進行歸一化,即可以自由選擇濾波結(jié)果是鄰域像素值之和的平均值(均值濾波),還是鄰域像素值之和。也就是說均值濾波是方框濾波的特殊情況。
方框濾波卷積核可以表示為:
K
=
1
α
[
1
1
1
?
1
1
1
1
1
?
1
1
?
?
?
?
?
?
1
1
1
?
1
1
1
1
1
?
1
1
1
1
1
?
1
1
]
K=\frac{1}{\alpha }\begin{bmatrix} 1& 1& 1& \cdots & 1& 1\\ 1& 1& 1& \cdots & 1& 1\\ \cdots & \cdots & \cdots & \cdots & \cdots & \cdots \\ 1& 1& 1& \cdots & 1& 1\\ 1& 1& 1& \cdots & 1& 1\\ 1& 1& 1& \cdots & 1& 1 \end{bmatrix}
K=α1?
?11?111?11?111?11?111????????11?111?11?111?
?
上式的對應(yīng)關(guān)系為:
α
=
{
1
w
i
d
t
h
×
h
e
i
g
h
t
n
o
r
m
a
l
i
z
e
=
1
1
n
o
r
m
a
l
i
z
e
=
0
\alpha =\left\{\begin{matrix} \frac{1}{width\times height}& normalize=1\\ 1& normalize=0 \end{matrix}\right.
α={width×height1?1?normalize=1normalize=0?
??4.2 實驗過程
使用函數(shù):cv2.boxFilter(src, ddepth, ksize, anchor, normalize, borderType)
參數(shù)說明:
- src:輸入圖像;
- ddepth:圖像深度,-1表示用原圖深度;
- ksize:內(nèi)核大?。?/li>
- anchor:錨點,默認為(-1,-1),表示當(dāng)前計算均值的點位于核的中心點位置;
- normalize:表示是否進行歸一化處理,值為1,進行歸一化處理;值為0,不進行歸一化處理;
- borderType:表示以何種方式處理邊界,默認即可。
??4.2.1 程序設(shè)計
"""
方框濾波
"""
gaussian_blur = cv2.boxFilter(gaussian_img, -1, (3, 3), normalize=0)
sp_blur = cv2.boxFilter(sp_img, -1, (3, 3), normalize=0)
h1 = np.hstack([gaussian_img, gaussian_blur])
h2 = np.hstack([sp_img, sp_blur])
v = np.vstack([h1, h2])
cv2.imwrite(r"C:\Users\Lenovo\Desktop\DIP\box_filter.jpg", v)
cv2.imshow('out', v)
cv2.waitKey()
??4.2.2 實驗結(jié)果
- 第一幅圖為被高斯噪聲污染的圖像;
- 第二幅圖為使用方框濾波對第一幅圖去噪后的圖像;
- 第三幅圖為被椒鹽噪聲污染的圖像;
- 第四幅圖為使用方框濾波對第三幅圖去噪后的圖像。
由圖可知,不經(jīng)過歸一化的方框濾波很容易出現(xiàn)大面積的白色。
??4.2.3 指標參數(shù)
gaussian_psnr, sp_psnr, gaussian_ssim, sp_ssim, gaussian_mse, sp_mse = compare(original, gaussian_blur, sp_blur)
print('方框濾波對高斯噪聲污染圖像去噪后的指標為:PSNR:{},SSIM:{},MSE:{}'.format(gaussian_psnr, gaussian_ssim, gaussian_mse))
print('方框濾波對椒鹽噪聲污染圖像去噪后的指標為:PSNR:{},SSIM:{},MSE:{}'.format(sp_psnr, sp_ssim, sp_mse))
結(jié)果為:
方框濾波對高斯噪聲污染圖像去噪后的指標為:PSNR:5.251255346836561,SSIM:0.415694536225471,MSE:19406.84003829956
方框濾波對椒鹽噪聲污染圖像去噪后的指標為:PSNR:5.328992238651672,SSIM:0.41684132817868463,MSE:19062.556196848553
??五、雙邊濾波
??5.1 濾波原理
雙邊濾波是一種非線性的濾波方法,其同時考慮空間幾何距離與灰度相似性。
??5.2 實驗過程
使用函數(shù):cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]])
參數(shù)說明:
- src:輸入圖像;
- d:濾波期間使用的每個像素鄰域的直徑,如果其值為非正數(shù),則從sigmaSpace計算;
- sigmaColor:在顏色空間中過濾sigma,較大的參數(shù)意味著像素鄰域內(nèi)較遠的顏色將相互影響;
- sigmaSpace:在幾何空間中過濾sigma,較大的參數(shù)意味著更遠的像素將相互影響;
??5.2.1 程序設(shè)計
"""
雙邊濾波
"""
gaussian_blur = cv2.bilateralFilter(gaussian_img, 25, 100, 100)
sp_blur = cv2.bilateralFilter(sp_img, 25, 100, 100)
h1 = np.hstack([gaussian_img, gaussian_blur])
h2 = np.hstack([sp_img, sp_blur])
v = np.vstack([h1, h2])
cv2.imwrite(r"C:\Users\Lenovo\Desktop\DIP\bilateral_filter.jpg", v)
cv2.imshow('out', v)
cv2.waitKey()
??5.2.2 實驗結(jié)果
- 第一幅圖為被高斯噪聲污染的圖像;
- 第二幅圖為使用雙邊濾波對第一幅圖去噪后的圖像;
- 第三幅圖為被椒鹽噪聲污染的圖像;
- 第四幅圖為使用雙邊濾波對第三幅圖去噪后的圖像。
??5.2.3 指標參數(shù)
gaussian_psnr, sp_psnr, gaussian_ssim, sp_ssim, gaussian_mse, sp_mse = compare(original, gaussian_blur, sp_blur)
print('雙邊濾波對高斯噪聲污染圖像去噪后的指標為:PSNR:{},SSIM:{},MSE:{}'.format(gaussian_psnr, gaussian_ssim, gaussian_mse))
print('雙邊濾波對椒鹽噪聲污染圖像去噪后的指標為:PSNR:{},SSIM:{},MSE:{}'.format(sp_psnr, sp_ssim, sp_mse))
結(jié)果為:
雙邊濾波對高斯噪聲污染圖像去噪后的指標為:PSNR:25.992916512934414,SSIM:0.6635250024737996,MSE:163.60203806559244
雙邊濾波對椒鹽噪聲污染圖像去噪后的指標為:PSNR:21.06964250996061,SSIM:0.3879879230675302,MSE:508.2953186035156
從指標結(jié)果可以看出,雙邊濾波對高斯噪聲的去除能力更強!
??六、高斯濾波
??6.1 濾波原理
在實際濾波中,將當(dāng)前像素作為核中心,利用卷積核對周圍鄰域像素作加權(quán)平均,其值作為當(dāng)前像素的新值。
高斯濾波步驟:
- 移動相關(guān)核的中心元素,使它位于輸入圖像待處理像素的正上方;
- 將輸入圖像的像素值作為權(quán)重,乘以相關(guān)核;
- 將上面各步得到的結(jié)果相加做為輸出。
簡單來說就是根據(jù)高斯分布得到高斯模板然后做卷積相加的一個過程。
https://www.cnblogs.com/kensporger/p/11628050.html
https://www.jianshu.com/p/73e6ccbd8f3f
??6.2 實驗過程
使用函數(shù):cv2.GaussianBlur(src, ksize, sigmaX [ , dst [ , sigmaY [ , borderType ] ] ] )
參數(shù)說明:
- src:輸入圖像;
- ksize:高斯核大小,必須是正數(shù)和奇數(shù);
- sigmaX:X方向的高斯核標準差;
- sigmaY:Y方向的高斯核標準差;如果該值為0,則默認為與sigma相等。
- borderType:邊界處理方式。
??6.2.1 程序設(shè)計
"""
高斯濾波
"""
gaussian_blur = cv2.GaussianBlur(gaussian_img, (5, 5), 0, 0)
sp_blur = cv2.GaussianBlur(sp_img, (5, 5), 0, 0)
h1 = np.hstack([gaussian_img, gaussian_blur])
h2 = np.hstack([sp_img, sp_blur])
v = np.vstack([h1, h2])
cv2.imwrite(r"C:\Users\Lenovo\Desktop\DIP\gaussian_filter.jpg", v)
cv2.imshow('out', v)
cv2.waitKey()
??6.2.2 實驗結(jié)果
- 第一幅圖為被高斯噪聲污染的圖像;
- 第二幅圖為使用高斯濾波對第一幅圖去噪后的圖像;
- 第三幅圖為被椒鹽噪聲污染的圖像;
- 第四幅圖為使用高斯濾波對第三幅圖去噪后的圖像。
??6.2.3 指標參數(shù)
gaussian_psnr, sp_psnr, gaussian_ssim, sp_ssim, gaussian_mse, sp_mse = compare(original, gaussian_blur, sp_blur)
print('高斯濾波對高斯噪聲污染圖像去噪后的指標為:PSNR:{},SSIM:{},MSE:{}'.format(gaussian_psnr, gaussian_ssim, gaussian_mse))
print('高斯濾波對椒鹽噪聲污染圖像去噪后的指標為:PSNR:{},SSIM:{},MSE:{}'.format(sp_psnr, sp_ssim, sp_mse))
結(jié)果為:文章來源:http://www.zghlxwxcb.cn/news/detail-446590.html
高斯濾波對高斯噪聲污染圖像去噪后的指標為:PSNR:27.80345326784865,SSIM:0.7496298168722767,MSE:107.82886505126953
高斯濾波對椒鹽噪聲污染圖像去噪后的指標為:PSNR:26.360239863855103,SSIM:0.6420068535144939,MSE:150.33370971679688
從指標結(jié)果可以看出,高斯濾波對高斯噪聲的去除能力更強!文章來源地址http://www.zghlxwxcb.cn/news/detail-446590.html
??七、全部代碼
import numpy as np
import cv2
from skimage.measure import compare_ssim, compare_psnr, compare_mse
original = cv2.imread(r"C:\Users\Lenovo\Desktop\DIP\lena1.jpg")
gaussian_img = cv2.imread(r"C:\Users\Lenovo\Desktop\DIP\gaussian.jpg")
sp_img = cv2.imread(r"C:\Users\Lenovo\Desktop\DIP\sp.jpg")
def compare(ori, gaussian_denosing, sp_denosing):
# ori為原圖(未被噪聲污染的圖),gaussian_denosing為經(jīng)過高斯噪聲污染的圖通過去噪算法去噪后的圖;sp_denosing為經(jīng)過椒鹽噪聲污染的圖通過去噪算法去噪后的圖
gaussian_psnr = compare_psnr(ori, gaussian_denosing)
sp_psnr = compare_psnr(ori, sp_denosing)
gaussian_ssim = compare_ssim(ori, gaussian_denosing, multichannel=True)
sp_ssim = compare_ssim(ori, sp_denosing, multichannel=True)
gaussian_mse = compare_mse(ori, gaussian_denosing)
sp_mse = compare_mse(ori, sp_denosing)
return gaussian_psnr, sp_psnr, gaussian_ssim, sp_ssim, gaussian_mse, sp_mse
"""
均值濾波
"""
gaussian_blur = cv2.blur(gaussian_img, (3, 3))
sp_blur = cv2.blur(sp_img, (3, 3))
h1 = np.hstack([gaussian_img, gaussian_blur])
h2 = np.hstack([sp_img, sp_blur])
v = np.vstack([h1, h2])
cv2.imwrite(r"C:\Users\Lenovo\Desktop\DIP\mean_filter.jpg", v)
cv2.imshow('out', v)
cv2.waitKey()
gaussian_psnr, sp_psnr, gaussian_ssim, sp_ssim, gaussian_mse, sp_mse = compare(original, gaussian_blur, sp_blur)
print('均值濾波對高斯噪聲污染圖像去噪后的指標為:PSNR:{},SSIM:{},MSE:{}'.format(gaussian_psnr, gaussian_ssim, gaussian_mse))
print('均值濾波對椒鹽噪聲污染圖像去噪后的指標為:PSNR:{},SSIM:{},MSE:{}'.format(sp_psnr, sp_ssim, sp_mse))
"""
中值濾波
"""
gaussian_blur = cv2.medianBlur(gaussian_img, 3)
sp_blur = cv2.medianBlur(sp_img, 3)
h1 = np.hstack([gaussian_img, gaussian_blur])
h2 = np.hstack([sp_img, sp_blur])
v = np.vstack([h1, h2])
cv2.imwrite(r"C:\Users\Lenovo\Desktop\DIP\median_filter.jpg", v)
cv2.imshow('out', v)
cv2.waitKey()
gaussian_psnr, sp_psnr, gaussian_ssim, sp_ssim, gaussian_mse, sp_mse = compare(original, gaussian_blur, sp_blur)
print('中值濾波對高斯噪聲污染圖像去噪后的指標為:PSNR:{},SSIM:{},MSE:{}'.format(gaussian_psnr, gaussian_ssim, gaussian_mse))
print('中值濾波對椒鹽噪聲污染圖像去噪后的指標為:PSNR:{},SSIM:{},MSE:{}'.format(sp_psnr, sp_ssim, sp_mse))
"""
方框濾波
"""
gaussian_blur = cv2.boxFilter(gaussian_img, -1, (3, 3), normalize=0)
sp_blur = cv2.boxFilter(sp_img, -1, (3, 3), normalize=0)
h1 = np.hstack([gaussian_img, gaussian_blur])
h2 = np.hstack([sp_img, sp_blur])
v = np.vstack([h1, h2])
cv2.imwrite(r"C:\Users\Lenovo\Desktop\DIP\box_filter.jpg", v)
cv2.imshow('out', v)
cv2.waitKey()
gaussian_psnr, sp_psnr, gaussian_ssim, sp_ssim, gaussian_mse, sp_mse = compare(original, gaussian_blur, sp_blur)
print('方框濾波對高斯噪聲污染圖像去噪后的指標為:PSNR:{},SSIM:{},MSE:{}'.format(gaussian_psnr, gaussian_ssim, gaussian_mse))
print('方框濾波對椒鹽噪聲污染圖像去噪后的指標為:PSNR:{},SSIM:{},MSE:{}'.format(sp_psnr, sp_ssim, sp_mse))
"""
雙邊濾波
"""
gaussian_blur = cv2.bilateralFilter(gaussian_img, 25, 100, 100)
sp_blur = cv2.bilateralFilter(sp_img, 25, 100, 100)
h1 = np.hstack([gaussian_img, gaussian_blur])
h2 = np.hstack([sp_img, sp_blur])
v = np.vstack([h1, h2])
cv2.imwrite(r"C:\Users\Lenovo\Desktop\DIP\bilateral_filter.jpg", v)
cv2.imshow('out', v)
cv2.waitKey()
gaussian_psnr, sp_psnr, gaussian_ssim, sp_ssim, gaussian_mse, sp_mse = compare(original, gaussian_blur, sp_blur)
print('雙邊濾波對高斯噪聲污染圖像去噪后的指標為:PSNR:{},SSIM:{},MSE:{}'.format(gaussian_psnr, gaussian_ssim, gaussian_mse))
print('雙邊濾波對椒鹽噪聲污染圖像去噪后的指標為:PSNR:{},SSIM:{},MSE:{}'.format(sp_psnr, sp_ssim, sp_mse))
"""
高斯濾波
"""
gaussian_blur = cv2.GaussianBlur(gaussian_img, (5, 5), 0, 0)
sp_blur = cv2.GaussianBlur(sp_img, (5, 5), 0, 0)
h1 = np.hstack([gaussian_img, gaussian_blur])
h2 = np.hstack([sp_img, sp_blur])
v = np.vstack([h1, h2])
cv2.imwrite(r"C:\Users\Lenovo\Desktop\DIP\gaussian_filter.jpg", v)
cv2.imshow('out', v)
cv2.waitKey()
gaussian_psnr, sp_psnr, gaussian_ssim, sp_ssim, gaussian_mse, sp_mse = compare(original, gaussian_blur, sp_blur)
print('高斯濾波對高斯噪聲污染圖像去噪后的指標為:PSNR:{},SSIM:{},MSE:{}'.format(gaussian_psnr, gaussian_ssim, gaussian_mse))
print('高斯濾波對椒鹽噪聲污染圖像去噪后的指標為:PSNR:{},SSIM:{},MSE:{}'.format(sp_psnr, sp_ssim, sp_mse))
到了這里,關(guān)于【OpenCV-Python】:基于均值、中值、方框、雙邊和高斯濾波的圖像去噪的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!