1、圖像噪聲
1.1圖像噪聲的分類
圖像噪聲按噪聲與信號的關(guān)系可分為加性噪聲和乘性噪聲;按照產(chǎn)生原因可分為外部噪聲和內(nèi)部噪聲;按照統(tǒng)計特性可分為平穩(wěn)噪聲和非平穩(wěn)噪聲;平穩(wěn)噪聲基于統(tǒng)計后的概率密度函數(shù)又可以分為:高斯噪聲、泊松噪聲、脈沖噪聲、瑞利噪聲。
1.2基于統(tǒng)計后的概率密度函數(shù)
圖像噪聲的種類是根據(jù)不同分類方法而劃分的,硬件工程師為了排查故障,可能更為關(guān)注外部噪聲和內(nèi)部噪聲;通信工程師可能會分為加性噪聲和乘性噪聲;為了對圖像進行去噪,圖像處理工程師更多的關(guān)注其統(tǒng)計后的概率密度,從而建立數(shù)學(xué)模型去處理相應(yīng)的噪聲
1.2.1高斯噪聲
?高斯噪聲污染圖
高斯噪聲的產(chǎn)生原因主要是圖像在拍攝時不夠明亮、亮度不夠均勻;電路各元器件自身噪聲和相互影響;傳感器長期工作溫度過高等。
1.2.2椒鹽噪聲
椒鹽噪聲是脈沖噪聲取值0或1的特例。它是一種隨機出現(xiàn)的黑點(胡椒)或者白點(鹽),前者是高灰度噪聲,后者是低灰度噪聲,一般兩者同時出現(xiàn)在圖像中。如下圖所示:
一般低光照條件下,圖像的噪聲多為椒鹽噪聲而不是高斯噪聲,比如礦井下的圖像。椒鹽噪聲通常使用中值濾波器進行處理。
2、圖像去噪算法
2.1空域濾波
空域濾波是在原圖像上直接進行數(shù)據(jù)運行,對像素值進行處理。如鄰域平均法、中值濾波、低通濾波等。
2.1.1均值濾波
在進行均值濾波時,首先要考慮需要對周圍多少個像素點取平均值。通常情況下,我們會以當(dāng)前像素點為中心,對行數(shù)和列數(shù)相等的一塊區(qū)域內(nèi)的所有像素點的像素值求平均。
例:
對于矩陣:
對所選定的3×3矩陣,選定中心像素點,對這個矩陣進行運算
中心點新值 = ( 1 +8 + 15 + 2 + 9 + 16 + 3 + 10 + 17)/9
? ? ? ? ? ? ? ? ? ?= 9
對于邊緣像素點,如圖所示:
新值 = ( 1 + 8 + 2 + 9)/4
? ? ? ? ? ?=? 5
除此以外,還可以擴展當(dāng)前圖像的周圍像素點。完成圖像邊緣擴展后,可以在新增的行列內(nèi)填充不同的像素值。OpenCV提供了多種邊界處理方 式,我們可以根據(jù)實際需要選用不同的邊界處理模式。
2.1.1.1OpenCv實現(xiàn)均值濾波
在OpenCV中,實現(xiàn)均值濾波的函數(shù)是cv2.blur(),其語法格式為: ? ? ? ? ?
? ? ? ? dst=cv2.blur(src,ksize,anchor,borderType)
? ? ? ? 式中:
? ? ? ? ?● dst是返回值,表示進行均值濾波后得到的處理結(jié)果。
? ? ? ? ?● src 是需要處理的圖像,即原始圖像。它可以有任意數(shù)量的通道,并能對各個通道獨立處理。圖像深度應(yīng)該是CV_8U、CV_16U、CV_16S、CV_32F 或者 CV_64F中的一種。
? ? ? ? ● ksize是濾波核的大小。濾波核大小是指在均值處理過程中,其鄰域圖像的高度和寬度。
? ? ? ? ● anchor 是錨點,其默認值是(-1,-1),表示當(dāng)前計算均值的點位于核的中心點位置。該值使用默認值即可,在特殊情況下可以指定不同的點作為錨點。
? ? ? ? ● borderType是邊界樣式,該值決定了以何種方式處理邊界。一般情況下不需要考慮該值的取值,直接采用默認值即可。 ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? 通常情況下,使用均值濾波函數(shù)時,對于錨點anchor和邊界樣式borderType,直接采用其默認值即可。因此,函數(shù)cv2.blur()的一般形式為:
? ? ? ? dst=cv2.blur(src,ksize) ? ?
2.1.1.2程序?qū)嵗? ?
import cv2 as cv
import numpy as np
def cv_show(name, img):
cv.imshow(name, img)
cv.waitKey(0)
cv.destroyAllWindows()
# 在圖片上生成椒鹽噪聲
def add_peppersalt_noise(image, n=10000):
result = image.copy()
# 測量圖片的長和寬
w, h =image.shape[:2]
# 生成n個椒鹽噪聲
for i in range(n):
x = np.random.randint(1, w)
y= np.random.randint(1, h)
if np.random.randint(0, 2) == 0 :
result[x, y] = 0
else:
result[x,y] = 255
return result
# 在圖片上生成高斯噪聲
def add_gauss_noise(image, mean=0, val=0.01):
size = image.shape
image = image / 255
gauss = np.random.normal(mean, val**0.05, size)
image = image + gauss
return image
# blur均值濾波,對高斯噪聲有較好的去除效果,對象可以是彩色圖像和灰度圖像
img = cv.imread('D:\\dlam.jpg')
if img is None:
print('Failed to read the image')
img1 = add_peppersalt_noise(img)
cv_show('img', img1)
# 默認為規(guī)定尺寸的1/n的全1矩陣
img2 = cv.blur(img1, (3, 3))
cv_show('img2', img2)
img3 = cv.blur(img1, (5, 5))
cv_show('img3', img3)
# 觀察不同濾波核對圖像濾波的影響
例:
原圖
添加椒鹽噪聲后
3X3卷積核濾波結(jié)果
?5X5卷積核濾波結(jié)果
?2.1.2高斯濾波
?在進行均值濾波時,其鄰域內(nèi)每個像素的權(quán)重是相等的。在高斯濾波中,會將中心點的權(quán)重值加大,遠離中心點的權(quán)重值減小,在此基礎(chǔ)上計算鄰域內(nèi)各個像素值不同權(quán)重的和。
2.1.2.1OpenCv實現(xiàn)均值濾波
在OpenCV中,實現(xiàn)中值濾波的函數(shù)是cv2.medianBlur(),其語法格式如下:
? ? ? ? ?dst=cv2.medianBlur(src,ksize)
? ? ? ? 式中:
? ? ? ? ● dst是返回值,表示進行中值濾波后得到的處理結(jié)果。
? ? ? ? ?● src 是需要處理的圖像,即源圖像。它能夠有任意數(shù)量的通道,并能對各個通道獨立處理。圖像深度應(yīng)該是CV_8U、CV_16U、CV_16S、CV_32F 或者 CV_64F中的一種。
? ? ? ? ● ksize 是濾波核的大小。濾波核大小是指在濾波處理過程中其鄰域圖像的高度和寬度。需要注意,核大小必須是比1大的奇數(shù),比如3、5、7等。?
2.1.2.2程序?qū)嵗?/h4>
import cv2 as cv
def cv_show(name, img):
cv.imshow(name, img)
cv.waitKey(0)
cv.destroyAllWindows()
def add_peppersalt_noise(image, n=10000):
result = image.copy()
# 測量圖片的長和寬
w, h =image.shape[:2]
# 生成n個椒鹽噪聲
for i in range(n):
x = np.random.randint(1, w)
y= np.random.randint(1, h)
if np.random.randint(0, 2) == 0 :
result[x, y] = 0
else:
result[x,y] = 255
return result
img = cv.imread('D:\\dlam.jpg')
if img is None:
print('Failed to read the image')
img1 = add_peppersalt_noise(img)
cv_show('after', img1)
# 中值濾波,可對灰色圖像和彩色圖像使用
img2 = cv.medianBlur(img1, 3)
cv_show('after1', img2)
# ksize變大圖像變模糊
img3 = cv.medianBlur(img1, 9)
cv_show('after2', img3)
import cv2 as cv
def cv_show(name, img):
cv.imshow(name, img)
cv.waitKey(0)
cv.destroyAllWindows()
def add_peppersalt_noise(image, n=10000):
result = image.copy()
# 測量圖片的長和寬
w, h =image.shape[:2]
# 生成n個椒鹽噪聲
for i in range(n):
x = np.random.randint(1, w)
y= np.random.randint(1, h)
if np.random.randint(0, 2) == 0 :
result[x, y] = 0
else:
result[x,y] = 255
return result
img = cv.imread('D:\\dlam.jpg')
if img is None:
print('Failed to read the image')
img1 = add_peppersalt_noise(img)
cv_show('after', img1)
# 中值濾波,可對灰色圖像和彩色圖像使用
img2 = cv.medianBlur(img1, 3)
cv_show('after1', img2)
# ksize變大圖像變模糊
img3 = cv.medianBlur(img1, 9)
cv_show('after2', img3)
原圖如下:
????????
添加高斯噪聲:
?高斯濾波結(jié)果:
????????高斯濾波對高斯噪聲消除效果較好。
2.1.3中值濾波
之前介紹的均值濾波、高斯濾波,都是線性濾波方式。由于線性濾波的結(jié)果是所有像素值的線性組合,因此含有噪聲的像素也會被考慮進去,噪聲不會被消除,而是以更柔和的方式存在。這時使用非線性濾波效果可能會更好。中值濾波與前面介紹的濾波方式不同,不再采用加權(quán)求均值的方式計算濾波結(jié)果。它用鄰域內(nèi)所有像素值的中間值來替代當(dāng)前像素點的像素值。
2.1.3.1OpenCv實現(xiàn)中值濾波
在OpenCV中,實現(xiàn)中值濾波的函數(shù)是cv2.medianBlur(),其語法格式如下:
? ? ? ? ?dst=cv2.medianBlur(src,ksize)
? ? ? ? 式中:
? ? ? ? ● dst是返回值,表示進行中值濾波后得到的處理結(jié)果。
? ? ? ? ?● src 是需要處理的圖像,即源圖像。它能夠有任意數(shù)量的通道,并能對各個通道獨立處理。圖像深度應(yīng)該是CV_8U、CV_16U、CV_16S、CV_32F 或者 CV_64F中的一種。
? ? ? ? ● ksize 是濾波核的大小。濾波核大小是指在濾波處理過程中其鄰域圖像的高度和寬度。需要注意,核大小必須是比1大的奇數(shù),比如3、5、7等。?
2.1.3.2程序?qū)嵗?/h4>
import cv2 as cv
def cv_show(name, img):
cv.imshow(name, img)
cv.waitKey(0)
cv.destroyAllWindows()
def add_peppersalt_noise(image, n=10000):
result = image.copy()
# 測量圖片的長和寬
w, h =image.shape[:2]
# 生成n個椒鹽噪聲
for i in range(n):
x = np.random.randint(1, w)
y= np.random.randint(1, h)
if np.random.randint(0, 2) == 0 :
result[x, y] = 0
else:
result[x,y] = 255
return result
img = cv.imread('D:\\dlam.jpg')
if img is None:
print('Failed to read the image')
img1 = add_peppersalt_noise(img)
cv_show('after', img1)
# 中值濾波,可對灰色圖像和彩色圖像使用
img2 = cv.medianBlur(img1, 3)
cv_show('after1', img2)
# ksize變大圖像變模糊
img3 = cv.medianBlur(img1, 9)
cv_show('after2', img3)
import cv2 as cv
def cv_show(name, img):
cv.imshow(name, img)
cv.waitKey(0)
cv.destroyAllWindows()
def add_peppersalt_noise(image, n=10000):
result = image.copy()
# 測量圖片的長和寬
w, h =image.shape[:2]
# 生成n個椒鹽噪聲
for i in range(n):
x = np.random.randint(1, w)
y= np.random.randint(1, h)
if np.random.randint(0, 2) == 0 :
result[x, y] = 0
else:
result[x,y] = 255
return result
img = cv.imread('D:\\dlam.jpg')
if img is None:
print('Failed to read the image')
img1 = add_peppersalt_noise(img)
cv_show('after', img1)
# 中值濾波,可對灰色圖像和彩色圖像使用
img2 = cv.medianBlur(img1, 3)
cv_show('after1', img2)
# ksize變大圖像變模糊
img3 = cv.medianBlur(img1, 9)
cv_show('after2', img3)
原圖如圖所示:
添加椒鹽噪聲:
3*3中值濾波效果:?
5*5中值濾波效果:?
? ? ? ? ?可以看出中值濾波對噪聲的消除效果比線性濾波好,但是隨著濾波核的增大,圖像也會變模糊。
2.2變換域濾波
圖像變換域濾波是對圖像進行某種變換,將圖像從空間域轉(zhuǎn)換到變換域,再對變換域中的變換系數(shù)進行處理,之后再從變換域轉(zhuǎn)換到空間域,達到降噪目的。如傅里葉變換、余弦變換、小波變換等。
2.2.1小波變換
小波閾值去噪的實質(zhì)為抑制信號中無用部分、增強有用部分的過程。小波閾值去噪過程為:(1)分解過程,即選定一種小波對信號進行n層小波分解;(2)閾值處理過程,即對分解的各層系數(shù)進行閾值處理,獲得估計小波系數(shù);(3)重構(gòu)過程,據(jù)去噪后的小波系數(shù)進行小波重構(gòu),獲得去噪后的信號。
影響效果的主要因素有:分解層數(shù)、閾值、小波基的選擇、閾值函數(shù)的選擇
2.2.1.1程序?qū)嵗?/h4>
import pywt
import numpy as np
from cv2 import cv2
from PIL import Image
#==============固定閾值、預(yù)設(shè)小波=====================
img = cv2.imread("lenags15.bmp", 0)
w = 'sym4' # 定義小波基的類型
l = 3 # 變換層次為3
coeffs = pywt.wavedec2(data=img, wavelet=w, level=l) # 對圖像進行小波分解
threshold = 0.04
list_coeffs = []
for i in range(1, len(coeffs)):
list_coeffs_ = list(coeffs[i])
list_coeffs.append(list_coeffs_)
for r1 in range(len(list_coeffs)):
for r2 in range(len(list_coeffs[r1])):
# 對噪聲濾波(軟閾值)
list_coeffs[r1][r2] = pywt.threshold(list_coeffs[r1][r2], threshold*np.max(list_coeffs[r1][r2]))
rec_coeffs = [] # 重構(gòu)系數(shù)
rec_coeffs.append(coeffs[0]) # 將原圖像的低尺度系數(shù)保留進來
for j in range(len(list_coeffs)):
rec_coeffs_ = tuple(list_coeffs[j])
rec_coeffs.append(rec_coeffs_)
denoised_img = pywt.waverec2(rec_coeffs, 'sym4')
denoised_img = Image.fromarray(np.uint8(denoised_img))
denoised_img.save("result.bmp")
import pywt
import numpy as np
from cv2 import cv2
from PIL import Image
#==============固定閾值、預(yù)設(shè)小波=====================
img = cv2.imread("lenags15.bmp", 0)
w = 'sym4' # 定義小波基的類型
l = 3 # 變換層次為3
coeffs = pywt.wavedec2(data=img, wavelet=w, level=l) # 對圖像進行小波分解
threshold = 0.04
list_coeffs = []
for i in range(1, len(coeffs)):
list_coeffs_ = list(coeffs[i])
list_coeffs.append(list_coeffs_)
for r1 in range(len(list_coeffs)):
for r2 in range(len(list_coeffs[r1])):
# 對噪聲濾波(軟閾值)
list_coeffs[r1][r2] = pywt.threshold(list_coeffs[r1][r2], threshold*np.max(list_coeffs[r1][r2]))
rec_coeffs = [] # 重構(gòu)系數(shù)
rec_coeffs.append(coeffs[0]) # 將原圖像的低尺度系數(shù)保留進來
for j in range(len(list_coeffs)):
rec_coeffs_ = tuple(list_coeffs[j])
rec_coeffs.append(rec_coeffs_)
denoised_img = pywt.waverec2(rec_coeffs, 'sym4')
denoised_img = Image.fromarray(np.uint8(denoised_img))
denoised_img.save("result.bmp")
結(jié)果對比:
原圖像:
結(jié)果圖像:
?
總結(jié):這里能夠看到小波去噪對去除高斯噪聲的效果還是可以的,但是效果不是很明顯。大家可以從閾值的選擇以及調(diào)整濾波的閾值,甚至將各層的閾值設(shè)置為不同的值再去試試。再看看有關(guān)的論文關(guān)于提升小波閾值效果的實現(xiàn)方法。本文只是舉個簡單的例子來說明小波閾值的處理過程
2.3深度學(xué)習(xí)方法
2.3.1DnCNN網(wǎng)絡(luò)
DnCNN是圖像去噪領(lǐng)域一篇鼻祖類型的文章,本文是關(guān)于該文章主要原理的解讀。DnCNN(Denoising Convolutional Neural Network)顧名思義,就是用于去噪的卷積神經(jīng)網(wǎng)絡(luò)。
文章標題:Beyond a Gaussian Denoiser: Residual Learning of Deep CNN for Image Denoising
文章鏈接:https://arxiv.org/pdf/1608.03981.pdf
代碼鏈接:?https://github.com/cszn/DnCNN(官方)
圖像的去噪問題普遍存在,首先我們知道圖像是真實世界的反映,或者說對真實世界的采樣,既然是采樣,難免失真,再加上采集元器件的一些不穩(wěn)定性,后期得到的圖像就含有更多的噪聲。設(shè)理想的無噪聲圖像為 x?,每個像素都有一個噪聲偏移量,得到的噪聲圖為 n?,作者把噪聲產(chǎn)生的原因簡化為下面的式子, y為添加噪聲后的圖像。
去噪任務(wù)的目的,就是根據(jù)噪聲圖像 y?,恢復(fù)出干凈圖像 x的過程。很顯然,一個式子里未知數(shù)有兩個,是有無窮多解的。傳統(tǒng)算法通過各種濾波器算子處理噪聲圖像,而本文使用卷積神經(jīng)網(wǎng)絡(luò)(以下簡稱CNN)實現(xiàn)。CNN是強大的圖像擬合器,把經(jīng)驗保存在網(wǎng)絡(luò)中,在新樣本中表現(xiàn)出較強的泛化性,以及比傳統(tǒng)算法更好的去噪效果。
DnCNN在VGG的基礎(chǔ)上進行修改,網(wǎng)絡(luò)結(jié)構(gòu)是(卷積、BN、ReLU)級聯(lián)的結(jié)構(gòu),模型內(nèi)部并不像ResNet一樣存在跳遠連接,而是在網(wǎng)絡(luò)的輸出使用殘差學(xué)習(xí)。對于每個卷積層,采用3×3尺寸的卷積核,步長設(shè)置為1,因此,對于一個 層卷積的網(wǎng)絡(luò),感受野大小為??,作者把層數(shù)設(shè)置為17,每個卷積層卷積核的數(shù)量設(shè)置為64。
模型的主要任務(wù)是,根據(jù)噪聲圖像?,估計干凈圖像??,但是,模型的直接輸出并不是 ?,而是噪聲圖像?,最終干凈圖的獲取過程用公式表達就是 ?。作者把這種方式稱作殘差學(xué)習(xí)(Residual Learning),并通過實驗證實了殘差學(xué)習(xí)對于提高訓(xùn)練穩(wěn)定性和去噪效果的好處。
參考文獻:
————————————————
版權(quán)聲明:均值濾波部分為為CSDN博主「Justth.」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_49478668/article/details/123217030
————————————————
版權(quán)聲明:高斯濾波部分為CSDN博主「Justth.」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_49478668/article/details/123485382
————————————————
版權(quán)聲明:中值濾波部分為CSDN博主「Justth.」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_49478668/article/details/123485382
————————————————
版權(quán)聲明:小波變換為CSDN博主「羊同學(xué)學(xué)Python」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/yy0722a/article/details/114855745文章來源:http://www.zghlxwxcb.cn/news/detail-596400.html
DnCNN網(wǎng)絡(luò):圖像去噪最簡單的網(wǎng)絡(luò)之一DnCNN之講解 - 知乎文章來源地址http://www.zghlxwxcb.cn/news/detail-596400.html
到了這里,關(guān)于常見圖像噪聲和常見圖像噪聲處理算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!