參考文章:
https://blog.csdn.net/zhoufan900428/article/details/37695357
常見噪聲:高斯噪聲,椒鹽噪聲,泊松噪聲,乘性噪聲
高斯噪聲
概率密度函數(shù)服從高斯分布的噪聲。
產(chǎn)生原因:
1)圖像傳感器在拍攝時(shí)市場(chǎng)不夠明亮、亮度不夠均勻;
2)電路各元器件自身噪聲和相互影響;
3)圖像傳感器長(zhǎng)期工作,溫度過高
泊松噪聲
泊松噪聲,就是符合泊松分布的噪聲模型,泊松分布適合于描述單位時(shí)間內(nèi)隨機(jī)事件發(fā)生的次數(shù)的概率分布。如某一服務(wù)設(shè)施在一定時(shí)間內(nèi)受到的服務(wù)請(qǐng)求的次數(shù),電話交換機(jī)接到呼叫的次數(shù)、汽車站臺(tái)的候客人數(shù)、機(jī)器出現(xiàn)的故障數(shù)、自然災(zāi)害發(fā)生的次數(shù)、DNA序列的變異數(shù)、放射性原子核的衰變數(shù)等等
乘性噪聲
乘性噪聲一般由信道不理想引起,它們與信號(hào)的關(guān)系是相乘,信號(hào)在它在,信號(hào)不在他也就不在。
椒鹽噪聲
椒鹽噪聲,椒鹽噪聲又稱脈沖噪聲,它隨機(jī)改變一些像素值,是由圖像傳感器,傳輸信道,解碼處理等產(chǎn)生的黑白相間的亮暗點(diǎn)噪聲。
椒鹽噪聲往往由圖像切割引起。
瑞利噪聲
瑞利噪聲相比高斯噪聲而言,其形狀向右歪斜,這對(duì)于擬合某些歪斜直方圖噪聲很有用。
瑞利噪聲的實(shí)現(xiàn)可以借由平均噪聲來(lái)實(shí)現(xiàn)。其matlab實(shí)現(xiàn)如下:
a = -0.2;
b = 0.03;
n_rayleigh = a + (-b .* log(1 - rand(M,N))).^0.5;
伽馬噪聲
伽馬噪聲的分布,服從了伽馬曲線的分布。伽馬噪聲的實(shí)現(xiàn),需要使用b個(gè)服從指數(shù)分布的噪聲疊加而來(lái)。指數(shù)分布的噪聲,可以使用均勻分布來(lái)實(shí)現(xiàn)。(b=1時(shí)為指數(shù)噪聲,b>1時(shí)通過若干個(gè)指數(shù)噪聲疊加,得到伽馬噪聲)
a = 25;
b = 3;
n_Erlang = zeros(M,N);
for j=1:b
n_Erlang = n_Erlang + (-1/a)*log(1 - rand(M,N));
end
均勻噪聲
使用python的skimage.util.random_noise(image, mode=‘gaussian’, seed=None, clip=True, **kwargs)來(lái)添加噪聲
1.先安裝必要的依賴庫(kù):
numpy , scipy , matpoltlib
2.安裝scikit-image
pip install scikit-image
3.導(dǎo)入util庫(kù)
import skimage
from skimage import util
4.函數(shù)介紹
def
random_noise
(
image
,
mode
=
'gaussian'
,
seed
=
None
,
clip
=
True
,
**
kwargs
)
:
功能:為浮點(diǎn)型圖片添加各種隨機(jī)噪聲
參數(shù):
image:輸入圖片(將會(huì)被轉(zhuǎn)換成浮點(diǎn)型),ndarray型
mode: 可選擇,
str
型,表示要添加的噪聲類型
gaussian:高斯噪聲
localvar:高斯分布的加性噪聲,在“圖像”的每個(gè)點(diǎn)處具有指定的局部方差。
poisson:泊松再生
salt:鹽噪聲,隨機(jī)將像素值變成
1
pepper:椒噪聲,隨機(jī)將像素值變成
0
或
-
1
,取決于矩陣的值是否帶符號(hào)
s
&
p:椒鹽噪聲
speckle:均勻噪聲(均值mean方差variance),out
=
image
+
n
*
image
seed: 可選的,
int
型,如果選擇的話,在生成噪聲前會(huì)先設(shè)置隨機(jī)種子以避免偽隨機(jī)
clip: 可選的,
bool
型,如果是
True
,在添加均值,泊松以及高斯噪聲后,會(huì)將圖片的數(shù)據(jù)裁剪到合適范圍內(nèi)。如果誰(shuí)
False
,則輸出矩陣的值可能會(huì)超出
[
-
1
,
1
]
mean: 可選的,
float
型,高斯噪聲和均值噪聲中的mean參數(shù),默認(rèn)值
=
0
var: 可選的,
float
型,高斯噪聲和均值噪聲中的方差,默認(rèn)值
=
0.01
(注:不是標(biāo)準(zhǔn)差)
local_vars:可選的,ndarry型,用于定義每個(gè)像素點(diǎn)的局部方差,在localvar中使用
amount: 可選的,
float
型,是椒鹽噪聲所占比例,默認(rèn)值
=
0.05
salt_vs_pepper:可選的,
float
型,椒鹽噪聲中椒鹽比例,值越大表示鹽噪聲越多,默認(rèn)值
=
0.5
,即椒鹽等量
-
-
-
-
-
-
-
-
返回值:ndarry型,且值在
[
0
,
1
]
或者
[
-
1
,
1
]
之間,取決于是否是有符號(hào)數(shù)
-
-
-
-
-
-
-
注意:略(見源碼)
python中的**kwargs是什么?
https://www.jianshu.com/p/037b6ea516f1這個(gè)講的也很標(biāo)準(zhǔn)(關(guān)于位置參數(shù),默認(rèn)參數(shù),非鍵值可變參數(shù),鍵值可變參數(shù))
*args
和
**kwargs
稱為“可變參數(shù)”,主要用與與函數(shù)定義,它們表示你可以將多個(gè)參數(shù)傳遞給這個(gè)函數(shù)。
這個(gè)“多個(gè)”的含義是,預(yù)先不知道會(huì)傳遞多少個(gè)(由于有些函數(shù)的mode參數(shù)不用,后邊跟的參數(shù)數(shù)量也隨之不同),上邊的添加噪聲函數(shù)就是個(gè)很好例子,有的噪聲不需要均值方差,有的需要。
*args
是用來(lái)發(fā)一個(gè)非鍵值對(duì)的可變數(shù)量的參數(shù)列表給一個(gè)函數(shù),例如
def
test_var_args
(
f_arg
,
*
argv
)
:
print
(
"first normal arg:"
,
f_arg
)
for
arg
in
argv
:
print
(
"another arg through *argv:"
,
arg
)
test_var_args
(
'yasoob'
,
'python'
,
'eggs'
,
'test'
)
輸出如下
first normal arg
:
yasoob
another arg through
*
argv
:
python
another arg through
*
argv
:
eggs
another arg through
*
argv
:
test
這說(shuō)明后邊的多個(gè)參數(shù)會(huì)被放進(jìn)一個(gè)名為argv的列表中,而函數(shù)內(nèi)部通過這個(gè)列表使用這些參數(shù)
**kwargs
允許將一個(gè)不定長(zhǎng)度的鍵值對(duì),作為參數(shù)傳遞給函數(shù),如果需要在一個(gè)函數(shù)中處理帶名字的參數(shù),就需要用到kwargs(意思就是kwarg代表很多有名字的參數(shù)),例如
def
test_args_kwargs
(
arg1
,
arg2
,
arg3
)
:
print
(
"arg1:"
,
arg1
)
print
(
"arg2:"
,
arg2
)
print
(
"arg3:"
,
arg3
)
分別使用*args和**kwargs來(lái)給函數(shù)傳遞參數(shù)
>>
>
args
=
(
"two"
,
3
,
5
)
>>
>
test_args_kwargs
(
*
args
)
arg1
:
two
arg2
:
3
arg3
:
5
>>
>
kwargs
=
{
"arg3"
:
3
,
"arg2"
:
"two"
,
"arg1"
:
5
}
>>
>
test_args_kwargs
(
**
kwargs
)
arg1
:
5
arg2
:
two
arg3
:
3
注意到,kwargs傳遞必須是鍵值對(duì)傳遞,而args只需要順序傳遞進(jìn)去即可
一個(gè)批量添加噪聲的python代碼
import
cv2
import
os
import
numpy
as
np
from
PIL
import
Image
from
skimage
import
util
#批處理
path
=
'F:/0.MaskRCNN(3 times)/hook_data/Mask/test3'
#圖片文件夾路徑
image_names
=
os
.
listdir
(
path
)
#列舉path下所有文件和文件夾名稱(返回一個(gè)list)
save_dir
=
os
.
path
.
join
(
path
,
'speckle(0,0.1)_test03'
)
#我的文件夾名稱
os
.
mkdir
(
save_dir
)
for
image_name
in
image_names
:
if
(
image_name
.
endswith
(
'.jpg'
)
)
:
img
=
Image
.
open
(
os
.
path
.
join
(
path
,
image_name
)
)
img
=
np
.
array
(
img
)
noise_gs_img
=
util
.
random_noise
(
img
,
mode
=
'speckle'
)
noise_gs_img
=
noise_gs_img
*
255
#由于輸出是[0,1]的浮點(diǎn)型,先轉(zhuǎn)成灰度圖(我的輸入就是灰度圖)
noise_gs_img
=
noise_gs_img
.
astype
(
np
.
int
)
#再變成整型數(shù)組
cv2
.
imwrite
(
os
.
path
.
join
(
save_dir
,
image_name
)
,
noise_gs_img
)
#保存到新建的文件夾
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
