Python實(shí)現(xiàn)圖像隨機(jī)添加椒鹽噪聲和高斯噪聲
圖像噪聲是指存在于圖像數(shù)據(jù)中的不必要的或多余的干擾信息。在噪聲的概念中,通常采用信噪比(Signal-Noise Rate, SNR)衡量圖像噪聲。通俗的講就是信號(hào)占多少,噪聲占多少,SNR越小,噪聲占比越大。
1.常見(jiàn)的圖像噪聲
(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語(yǔ)言十分不建議進(jìn)行圖像像素遍歷操作,畢竟性能太差,速度太慢了(除非寫(xiě)成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,這樣通過(guò)矩陣的處理,可以快速添加椒鹽噪聲。
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
3. Demo性能測(cè)試
需要用到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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解pandas.DataFrame中刪除包涵特定字符串所在的行
這篇文章主要介紹了pandas.DataFrame中刪除包涵特定字符串所在的行,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04Pandas刪除數(shù)據(jù)的幾種情況(小結(jié))
這篇文章主要介紹了Pandas刪除數(shù)據(jù)的幾種情況(小結(jié)),詳細(xì)的介紹了4種方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06pandas針對(duì)excel處理的實(shí)現(xiàn)
這篇文章主要介紹了pandas針對(duì)excel處理的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01聽(tīng)歌識(shí)曲--用python實(shí)現(xiàn)一個(gè)音樂(lè)檢索器的功能
本篇文章中主要介紹了用python實(shí)現(xiàn)一個(gè)音樂(lè)檢索器,類似于QQ音樂(lè)的搖一搖識(shí)曲,有興趣的同學(xué)可以了解一下。2016-11-11