Python實(shí)現(xiàn)圖像隨機(jī)添加椒鹽噪聲和高斯噪聲
圖像噪聲是指存在于圖像數(shù)據(jù)中的不必要的或多余的干擾信息。在噪聲的概念中,通常采用信噪比(Signal-Noise Rate, SNR)衡量圖像噪聲。通俗的講就是信號占多少,噪聲占多少,SNR越小,噪聲占比越大。
1.常見的圖像噪聲
(1)高斯噪聲
高斯噪聲Gaussian noise,是指它的概率密度函數(shù)服從高斯分布(即正態(tài)分布)的一類噪聲,通常是因?yàn)椴涣颊彰骱透邷匾鸬膫鞲衅髟肼暋?/p>

(2) 椒鹽噪聲
椒鹽噪聲salt-and-pepper noise,又稱為脈沖噪聲,它是一種隨機(jī)出現(xiàn)的白點(diǎn)(鹽噪聲)或者黑點(diǎn)(椒噪聲),通常是由圖像傳感器,傳輸信道,解壓處理等產(chǎn)生的黑白相間的亮暗點(diǎn)噪聲(椒-黑,鹽-白)。常用的去除這種噪聲的有效手段是使用中值濾波器。

2.生成圖像噪聲
在原始圖像基礎(chǔ)上加上噪聲分量,即可生成圖像噪聲
(1)高斯噪聲
def gaussian_noise(image, mean=0.1, sigma=0.1):
"""
添加高斯噪聲
:param image:原圖
:param mean:均值
:param sigma:標(biāo)準(zhǔn)差 值越大,噪聲越多
:return:噪聲處理后的圖片
"""
image = np.asarray(image / 255, dtype=np.float32) # 圖片灰度標(biāo)準(zhǔn)化
noise = np.random.normal(mean, sigma, image.shape).astype(dtype=np.float32) # 產(chǎn)生高斯噪聲
output = image + noise # 將噪聲和圖片疊加
output = np.clip(output, 0, 1)
output = np.uint8(output * 255)
return output(2) 椒鹽噪聲(速度慢)
常規(guī)的方法,需要遍歷每個(gè)像素,添加椒鹽噪聲,該方法十分緩慢。Python語言十分不建議進(jìn)行圖像像素遍歷操作,畢竟性能太差,速度太慢了(除非寫成C/C++版本)。我們可以借助numpy的矩陣處理,實(shí)現(xiàn)快速的添加椒鹽噪聲。
def salt_pepper_noise(image: np.ndarray, prob=0.01):
"""
添加椒鹽噪聲,該方法需要遍歷每個(gè)像素,十分緩慢
:param image:
:param prob: 噪聲比例
:return:
"""
for i in range(image.shape[0]):
for j in range(image.shape[1]):
if random.random() < prob:
image[i][j] = 0 if random.random() < 0.5 else 255
else:
image[i][j] = image[i][j]
return image(3) 椒鹽噪聲(快速版)
我們可以借助numpy的矩陣處理,實(shí)現(xiàn)快速的添加椒鹽噪聲。基本思路:利用np.random.uniform生成0~1的均勻噪聲( uniform distribution noise),然后將noise > prob的像素設(shè)置0或者255,這樣通過矩陣的處理,可以快速添加椒鹽噪聲。
def fast_salt_pepper_noise(image: np.ndarray, prob=0.02):
"""
隨機(jī)生成一個(gè)0~1的mask,作為椒鹽噪聲
:param image:圖像
:param prob: 椒鹽噪聲噪聲比例
:return:
"""
image = add_uniform_noise(image, prob * 0.51, vaule=255)
image = add_uniform_noise(image, prob * 0.5, vaule=0)
return image
def add_uniform_noise(image: np.ndarray, prob=0.05, vaule=255):
"""
隨機(jī)生成一個(gè)0~1的mask,作為椒鹽噪聲
:param image:圖像
:param prob: 噪聲比例
:param vaule: 噪聲值
:return:
"""
h, w = image.shape[:2]
noise = np.random.uniform(low=0.0, high=1.0, size=(h, w)).astype(dtype=np.float32) # 產(chǎn)生高斯噪聲
mask = np.zeros(shape=(h, w), dtype=np.uint8) + vaule
index = noise > prob
mask = mask * (~index)
output = image * index[:, :, np.newaxis] + mask[:, :, np.newaxis]
output = np.clip(output, 0, 255)
output = np.uint8(output)
return output3. Demo性能測試
需要用到pybaseutils工具,pip安裝即可
# -*-coding: utf-8 -*-
"""
@Author : panjq
@E-mail : pan_jinquan@163.com
@Date : 2022-07-27 15:23:24
@Brief :
"""
import cv2
import random
import numpy as np
from pybaseutils import time_utils
@time_utils.performance("gaussian_noise")
def gaussian_noise(image, mean=0.1, sigma=0.1):
"""
添加高斯噪聲
:param image:原圖
:param mean:均值
:param sigma:標(biāo)準(zhǔn)差 值越大,噪聲越多
:return:噪聲處理后的圖片
"""
image = np.asarray(image / 255, dtype=np.float32) # 圖片灰度標(biāo)準(zhǔn)化
noise = np.random.normal(mean, sigma, image.shape).astype(dtype=np.float32) # 產(chǎn)生高斯噪聲
output = image + noise # 將噪聲和圖片疊加
output = np.clip(output, 0, 1)
output = np.uint8(output * 255)
return output
@time_utils.performance("salt_pepper_noise")
def salt_pepper_noise(image: np.ndarray, prob=0.01):
"""
添加椒鹽噪聲,該方法需要遍歷每個(gè)像素,十分緩慢
:param image:
:param prob: 噪聲比例
:return:
"""
for i in range(image.shape[0]):
for j in range(image.shape[1]):
if random.random() < prob:
image[i][j] = 0 if random.random() < 0.5 else 255
else:
image[i][j] = image[i][j]
return image
@time_utils.performance("fast_salt_pepper_noise")
def fast_salt_pepper_noise(image: np.ndarray, prob=0.02):
"""
隨機(jī)生成一個(gè)0~1的mask,作為椒鹽噪聲
:param image:圖像
:param prob: 椒鹽噪聲噪聲比例
:return:
"""
image = add_uniform_noise(image, prob * 0.51, vaule=255)
image = add_uniform_noise(image, prob * 0.5, vaule=0)
return image
def add_uniform_noise(image: np.ndarray, prob=0.05, vaule=255):
"""
隨機(jī)生成一個(gè)0~1的mask,作為椒鹽噪聲
:param image:圖像
:param prob: 噪聲比例
:param vaule: 噪聲值
:return:
"""
h, w = image.shape[:2]
noise = np.random.uniform(low=0.0, high=1.0, size=(h, w)).astype(dtype=np.float32) # 產(chǎn)生高斯噪聲
mask = np.zeros(shape=(h, w), dtype=np.uint8) + vaule
index = noise > prob
mask = mask * (~index)
output = image * index[:, :, np.newaxis] + mask[:, :, np.newaxis]
output = np.clip(output, 0, 255)
output = np.uint8(output)
return output
def cv_show_image(title, image, use_rgb=True, delay=0):
"""
調(diào)用OpenCV顯示RGB圖片
:param title: 圖像標(biāo)題
:param image: 輸入是否是RGB圖像
:param use_rgb: True:輸入image是RGB的圖像, False:返輸入image是BGR格式的圖像
:return:
"""
img = image.copy()
if img.shape[-1] == 3 and use_rgb:
img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR) # 將BGR轉(zhuǎn)為RGB
# cv2.namedWindow(title, flags=cv2.WINDOW_AUTOSIZE)
cv2.namedWindow(title, flags=cv2.WINDOW_NORMAL)
cv2.imshow(title, img)
cv2.waitKey(delay)
return img
if __name__ == "__main__":
test_file = "test.png"
image = cv2.imread(test_file)
prob = 0.02
for i in range(10):
out1 = gaussian_noise(image.copy())
out2 = salt_pepper_noise(image.copy(), prob=prob)
out3 = fast_salt_pepper_noise(image.copy(), prob=prob)
print("----" * 10)
cv_show_image("image", image, use_rgb=False, delay=1)
cv_show_image("gaussian_noise", out1, use_rgb=False, delay=1)
cv_show_image("salt_pepper_noise", out2, use_rgb=False, delay=1)
cv_show_image("fast_salt_pepper_noise", out3, use_rgb=False, delay=0)循環(huán)機(jī)10次,salt_pepper_noise平均耗時(shí)125.49021ms,而fast_salt_pepper_noise平均耗時(shí)6.12011ms ,性能提高60倍左右,其生成的效果是基本一致的
call gaussian_noise elapsed: avg:19.42925ms total:194.29255ms count:10
call salt_pepper_noise elapsed: avg:125.49021ms total:1254.90212ms count:10
call fast_salt_pepper_noise elapsed: avg:6.12011ms total:61.20110ms count:10
原圖

高斯噪聲

salt_pepper_noise

fast_salt_pepper_noise

到此這篇關(guān)于Python實(shí)現(xiàn)圖像隨機(jī)添加椒鹽噪聲和高斯噪聲的文章就介紹到這了,更多相關(guān)Python圖像添加噪聲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解pandas.DataFrame中刪除包涵特定字符串所在的行
這篇文章主要介紹了pandas.DataFrame中刪除包涵特定字符串所在的行,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
Pandas刪除數(shù)據(jù)的幾種情況(小結(jié))
這篇文章主要介紹了Pandas刪除數(shù)據(jù)的幾種情況(小結(jié)),詳細(xì)的介紹了4種方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06
聽歌識曲--用python實(shí)現(xiàn)一個(gè)音樂檢索器的功能
本篇文章中主要介紹了用python實(shí)現(xiàn)一個(gè)音樂檢索器,類似于QQ音樂的搖一搖識曲,有興趣的同學(xué)可以了解一下。2016-11-11

