圖像在獲取和傳輸過程種會(huì)受到隨機(jī)信號(hào)的干擾從而產(chǎn)生噪聲,例如電阻引起的熱噪聲、光子噪聲、暗電流噪聲以及光響應(yīng)非均勻性噪聲等,由于噪聲會(huì)影響對(duì)圖像的理解以及后續(xù)的處理工作,因此去除噪聲的影響在圖像中具有十分重要的意義。圖像中常見的噪聲有:椒鹽噪聲、高斯噪聲、泊松噪聲和乘性噪聲。本文將介紹椒鹽噪聲和高斯噪聲產(chǎn)生的原因和如何在圖像中添加噪聲。生成的含有噪聲的圖像可以應(yīng)用于后續(xù)的濾波處理中。
1 椒鹽噪聲
椒鹽噪聲又稱作脈沖噪聲,會(huì)隨機(jī)改變圖像中的像索值,是相機(jī)、傳輸通道、解碼處理等過程中產(chǎn)生的黑白相間的亮暗點(diǎn)噪聲。它就像在圖像上隨機(jī)撒上的一些鹽粒 和黑胡椒粒,因此而得名。OpenCV4 中沒有提供專門為圖像添加椒鹽噪聲的函數(shù),需要使用者根據(jù)自己需求編寫生成椒鹽噪聲的程序。
考慮到椒鹽噪聲會(huì)隨機(jī)產(chǎn)生在圖像中的任何一個(gè)位置,因此要生成椒鹽噪聲,我們需要用到隨機(jī)數(shù)生成函數(shù)。由于NumPy在數(shù)據(jù)處理中的優(yōu)異表現(xiàn),對(duì)于隨機(jī)數(shù)的生成,我們可以使用np.random.randint()函數(shù)。
#np.random.randint()函數(shù)原型
output = np.random.randint(low
[, high
[, size
[, dtype]]])
其中各返回值和參數(shù)的含義分別為:
low:生成的隨機(jī)數(shù)的最小值
high:生成的隨機(jī)數(shù)的最大值
size:生成的隨機(jī)數(shù)的維度
dtype:生成的隨機(jī)數(shù)的格式
該函數(shù)可以用于隨機(jī)數(shù)的生成,并將生成的隨機(jī)數(shù)通過值返回。生成的隨機(jī)數(shù)范圍是[low,high),包括low但不包括high 。
向圖像中添加椒鹽噪聲的步驟如下:
(1)確定添加椒鹽噪聲的位置。根據(jù)椒鹽噪聲會(huì)隨機(jī)出現(xiàn)在圖像中的任何一個(gè)位置的特性, 我們可以利用np.random.randint()函數(shù)生成兩個(gè)隨機(jī)數(shù),分別用于確定椒鹽噪聲產(chǎn)生的行和列。
(2)確定噪聲的種類。不僅椒鹽噪聲的位置是隨機(jī)的,噪聲是黑色的還是白色同樣是隨機(jī)的,因此可以再次生成隨機(jī)數(shù),通過判斷隨機(jī)數(shù)是0還是1來確定該像素是白色噪聲還是黑色噪聲。
(3)修改圖像像素的灰度值。判斷圖像通道數(shù),對(duì)于通道數(shù)不同的圖像,表示像素白色的方式也不相同。若圖像為多通道的,則每個(gè)通道中的值都將改變;否則,只需要改變單通道中的一個(gè)值。
(4)得到含有椒鹽噪聲的圖像。
示例代碼文章來源:http://www.zghlxwxcb.cn/news/detail-442026.html
# -*- coding:utf-8 -*-
import cv2 as cv
import numpy as np
import sys
def add_noisy(image, n=10000):
result = image.copy()
w, h = image.shape[:2]
for i in range(n):
# 分別在寬和高的范圍內(nèi)生成一個(gè)隨機(jī)值,模擬代表x, y坐標(biāo)
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
if __name__ == '__main__':
# 讀取圖像并判斷是否讀取成功
img = cv.imread('../images/cat.jpg')
if img is None:
print('Failed to read cat.jpg.')
sys.exit()
# 灰度圖像添加椒鹽噪聲
gray_image = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
gray_image_noisy = add_noisy(gray_image, 10000)
# 彩色圖像添加椒鹽噪聲
color_image_noisy = add_noisy(img, 10000)
# 展示結(jié)果
cv.imshow("Gray Image", gray_image)
cv.imshow("Gray Image Noisy", gray_image_noisy)
cv.imshow("Color Image", img)
cv.imshow("Color Image Noisy", color_image_noisy)
cv.waitKey(0)
cv.destroyAllWindows()
運(yùn)行結(jié)果如下圖所示。
2 高斯噪聲
高斯噪聲是指噪聲分布的概率密度函數(shù)服從高斯分布(正態(tài)分布)的一類噪聲,其產(chǎn)生的主要原因是在拍攝時(shí)視場(chǎng)較暗且亮度不均勻,這會(huì)產(chǎn)生高斯噪聲。除此之外,電子元器件自身的噪聲和它們互相影響也是造成高斯噪聲的重要原因。高斯噪聲的概率密度函數(shù)如下式所示。
p
(
z
)
=
1
2
π
σ
e
?
(
z
?
μ
)
2
2
σ
2
p(z)=\frac{1}{\sqrt{2 \pi} \sigma} \mathrm{e}^{\frac{-(z-\mu)^{2}}{2 \sigma^{2}}}
p(z)=2π?σ1?e2σ2?(z?μ)2?
其中,
z
z
z 表示圖像像素的灰度值;
μ
\mu
μ 表示像素值的平均值或期望值;
σ
\sigma
σ 表示像素的標(biāo)準(zhǔn)差,標(biāo)準(zhǔn)差的平方
(
σ
2
)
(\sigma^2)
(σ2)。椒鹽噪聲隨機(jī)出現(xiàn)在圖像中的任意位置,高斯噪聲出現(xiàn)在圖像中所有位置。
OpenCV4中沒有專門提供為圖像添加高斯噪聲的函數(shù),對(duì)照在圖像中添加椒鹽噪聲的過程,我們可以利用產(chǎn)生隨機(jī)數(shù)的函數(shù)來對(duì)圖像添加高斯噪聲。NumPy中提供了可以產(chǎn)生符合高斯分布(正態(tài)分布)的隨機(jī)數(shù)的 np.random.normal()函數(shù)。
#np.random.normal()函數(shù)原型
output = np.random.normal(loc,
scale
[, size])
其中各返回值和參數(shù)的含義分別為:
loc:高斯分布的平均值
scale:高斯分布的標(biāo)準(zhǔn)差
size:輸出的隨機(jī)數(shù)據(jù)維度
該函數(shù)用于生成一個(gè)指定形狀的符合高斯分布的隨機(jī)數(shù),并將生成的結(jié)果通過值返回。第1個(gè)參數(shù)對(duì)應(yīng)整個(gè)高斯分布的中心。第2個(gè)參數(shù)對(duì)應(yīng)高斯分布的寬度。scale 值越大,分布越扁平;反之,分布越高聳。第3個(gè)參數(shù)為可選參數(shù),可根據(jù)需求進(jìn)行輸出尺寸的設(shè)置,若未指定,則僅輸出單個(gè)值。當(dāng)參數(shù)loc設(shè)置為0,scale 設(shè)置為1時(shí),即代表標(biāo)準(zhǔn)正態(tài)分布。
在圖像中添加高斯噪聲的過程大致分為以下3個(gè)步驟。
(1) 根據(jù)圖像尺寸,使用np.random.normal()函數(shù)生成符合高斯分布的隨機(jī)數(shù)矩陣。
(2)將原圖像和生成的隨機(jī)數(shù)矩陣相加。
(3)得到添加高斯噪聲之后的圖像。
依照上述思想,示例程序用于對(duì)灰度圖像和彩色圖像添加高斯噪聲。由于高斯噪聲是隨機(jī)生成的,因此每次運(yùn)行結(jié)果會(huì)有差異。
示例代碼
# -*- coding:utf-8 -*-
import cv2 as cv
import numpy as np
import sys
def add_noise(image, mean=0, val=0.01):
size = image.shape
image = image / 255
gauss = np.random.normal(mean, val ** 0.5, size)
noise = image + gauss
return gauss, noise
if __name__ == '__main__':
# 讀取圖像并判斷是否讀取成功
img = cv.imread('../images/cat.jpg')
if img is None:
print('Failed to read cat.jpg.')
sys.exit()
# 灰度圖像添加高斯噪聲
gray_image = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
gray_gauss, gray_noisy_image = add_noise(gray_image)
# 彩色圖像添加高斯噪聲
color_gauss, color_noisy_image = add_noise(img)
# 展示結(jié)果
cv.imshow("Gray Image", gray_image)
cv.imshow("Gray Noisy Image", gray_noisy_image)
cv.imshow("Color Image", img)
cv.imshow("Color Noisy Image", color_noisy_image)
cv.waitKey(0)
cv.destroyAllWindows()
運(yùn)行結(jié)果如下圖所示,結(jié)果中展示了向灰度圖象和RGB圖像中添加高斯噪聲的結(jié)果。文章來源地址http://www.zghlxwxcb.cn/news/detail-442026.html
到了這里,關(guān)于OpenCV學(xué)習(xí)筆記(十一)——圖像噪聲的生成(椒鹽噪聲、高斯噪聲)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!