OpenCV實現圖像噪聲、去噪基本方法

一、噪聲分類

1、高斯噪聲

指服從高斯分布(正態分布)的一類噪聲,其產生的主要原因是由于相機在拍攝時視場較暗且亮度不均勻造成的,同時相機長時間工作使得溫度過高也會引起高斯噪聲,另外電路元器件白身噪聲和互相影響也是造成高斯噪聲的重要原因之一。

概率密度函數(PDF)如下:

初始圖片:

注意加噪聲時,不能直接將 noise+img,不然最終出來的是一片空白和零星幾個噪點,原因在于cv2.imshow輸入要求是 0-1 float 或者 0-255 int。

代碼:

import cv2
import random
import numpy as np
img = cv2.imread('A.png')# 產生高斯隨機數
noise = np.random.normal(0,50,size=img.size).reshape(img.shape[0],img.shape[1],img.shape[2])
# 加上噪聲
img = img + noise
img = np.clip(img,0,255)
img = img/255   cv2.imshow('Gauss noise',img)
cv2.waitKey(0)

3)高斯濾波

高斯濾波是一種線性平滑濾波,一般用于消除高斯噪聲。對于每一個像素點的值,是由其本身和鄰域內的其他像素值經過加權平均后得到。

二維高斯函數:

具體過程:

代碼:使用cv2.GaussianBlur()函數

注意高斯模糊半徑不能為偶數

濾波結果:

2、泊松噪聲

簡言之就是符合泊松分布的噪聲模型,又稱散粒噪聲。

使用**np.random.poisson()**函數

import cv2
import random
import numpy as np
img = cv2.imread('A.png')# 產生泊松噪聲
noise = np.random.poisson(lam=20,size=img.shape).astype('uint8')# 加上噪聲
img = img + noise
np.clip(img,0,255)
img = img/255cv2.imshow('Poisson noise',img)
cv2.waitKey(0)

λ值越大,噪聲程度越深。

3、椒鹽噪聲

椒鹽噪聲又稱為脈沖噪聲,是在圖像上隨機出現黑色白色的像素,顧名思義就是椒鹽噪聲 = 椒噪聲(值為0,黑色) + 鹽噪聲(值為255,白色)

直接上代碼:

import cv2
import random
import numpy as np
img = cv2.imread('A.png')# 轉化成向量
x = img.reshape(1,-1)  
# 設置信噪比
SNR = 0.85
# 得到要加噪的像素數目
noise_num = x.size * (1-SNR)
# 得到需要加噪的像素值的位置
list = random.sample(range(0,x.size),int(noise_num))for i in list:if random.random() >= 0.5:x[0][i] = 0else:x[0][i] = 255
img1 = x.reshape(img.shape)cv2.imshow('salt&pepper noise',img1)
cv2.waitKey(0)

SNR越小,噪聲越大。

4、瑞利噪聲

一般是由由信道不理想引起的,它與信號的關系是相乘,信號在它在,信號不在他也就不在。

瑞利密度對傾斜形狀直方圖的建模非常有用。

在生成瑞利噪聲的時候,其實采用的是**np.random.rayleigh()** 方法生成,而這個方法就是根據第二個公式來的,所以只需要指定1個參數,得到的分布和第一個公式相比本質是相同的。

代碼:

import cv2
import random
import numpy as np
img = cv2.imread('A.png')# 產生瑞利噪聲
sigma = 70.0
noise = np.random.rayleigh(sigma, size=img.shape)
# 可以試試下面這個效果
# noise = np.random.rayleigh(img, size=img.shape)# 加上噪聲
img = img + noise
np.clip(img,0,255)
img = img/255cv2.imshow('Rayleigh noise',img)
cv2.waitKey(0)
print(img.shape)

5、愛爾蘭(伽馬)噪聲

概率密度函數(PDF)如下:(b是一個正整數)

指數分布和卡方分布其實可以看成是伽馬分布的特殊形式。

b = 1時:指數分布;

b =n/2,a = 1/2時:卡方分布。

代碼:

noise = np.random.gamma(shape=10.0,scale=10.0,size=img.shape)
#其他部分同上

6、均勻噪聲

noise = np.random.uniform(50,100,img.shape)
#其他部分同上

二、去噪方法

1、均值濾波

1.1 算術平均濾波

import cv2
import random
import numpy as np
img = cv2.imread('A.png')# 產生高斯隨機數
noise = np.random.normal(0,50,size=img.size).reshape(img.shape[0],img.shape[1],img.shape[2])
# 加上噪聲
img = img + noise
img = np.clip(img,0,255)
img = img/255   # 算術平均濾波
img1 = np.transpose(img,(2,0,1))  #轉換成[channel,H,W]形式
m = 3   #定義濾波核大小
n = 3
rec_img = np.zeros((img1.shape[0],img1.shape[1]-m+1,img1.shape[2]-n+1))
for channel in range(rec_img.shape[0]):for i in range(rec_img[channel].shape[0]):for j in range(rec_img[channel].shape[1]):rec_img[channel][i,j] = img1[channel][i:i+m,j:j+n].sum()/(m*n)
rec_img = np.transpose(rec_img,(1,2,0))cv2.imshow('average',rec_img)
cv2.waitKey(0)

具體過程可以配合下圖理解

去噪效果:

1.2 幾何均值濾波

import cv2
import random
import numpy as np
img = cv2.imread('A.png')# 產生高斯隨機數
noise = np.random.normal(0,50,size=img.size).reshape(img.shape[0],img.shape[1],img.shape[2])
# 加上噪聲
img = img + noise
img = np.clip(img,0,255)
img = img/255   # 幾何均值濾波
img1 = np.transpose(img,(2,0,1))  #轉換成[channel,H,W]形式
m = 3   #定義濾波核大小
n = 3
rec_img = np.zeros((img1.shape[0],img1.shape[1]-m+1,img1.shape[2]-n+1))
for channel in range(rec_img.shape[0]):for i in range(rec_img[channel].shape[0]):for j in range(rec_img[channel].shape[1]):rec_img[channel][i,j] = np.power(np.prod(img1[channel][i:i+m,j:j+n]),1/(m*n))
rec_img = np.transpose(rec_img,(1,2,0))cv2.imshow('average',rec_img)
cv2.waitKey(0)

去噪效果:

幾何均值濾波對0值是非常敏感,缺陷也很明顯,那就是當窗口內像素只要有一個值為0,則其計算得到的值就是0。

1.3 諧波平均濾波

rec_img[channel][i,j] = 1/(np.power(img1[channel][i:i+m,j:j+n],-1).sum())*(m*n)
# 其余部分同上

該方法既能處理鹽粒噪聲,又能處理類似于于高斯噪聲的其他噪聲,但是不能處理胡椒噪聲

2、統計排序濾波

2.1 中值濾波

我們非常熟悉的一種去噪方法,它是用像素鄰域中的灰度中值來代替像素的值。

代碼:

import cv2
import random
import numpy as np
img = cv2.imread('A.png')# 產生高斯隨機數
noise = np.random.normal(0,50,size=img.size).reshape(img.shape[0],img.shape[1],img.shape[2])
# 加上噪聲
img = img + noise
img = np.clip(img,0,255)
img = img/255   # 中值濾波
img1 = np.transpose(img,(2,0,1))  #轉換成[channel,H,W]形式
m = 3   #定義濾波核大小
n = 3
rec_img = np.zeros((img1.shape[0],img1.shape[1]-m+1,img1.shape[2]-n+1))
for channel in range(rec_img.shape[0]):for i in range(rec_img[channel].shape[0]):for j in range(rec_img[channel].shape[1]):rec_img[channel][i,j] = np.median(img1[channel][i:i+m,j:j+n])
rec_img = np.transpose(rec_img,(1,2,0))cv2.imshow('median',rec_img)
cv2.waitKey(0)

去噪效果:

或者直接使用cv2.medianBlur()函數

import cv2
import random
import numpy as np
img = cv2.imread('A.png')# 產生高斯隨機數
noise = np.random.normal(0,50,size=img.size).reshape(img.shape[0],img.shape[1],img.shape[2])
# 加上噪聲
img = img + noise
img = np.clip(img,0,255)
img = np.uint8(img)# 中值濾波
rec_img = cv2.medianBlur(img,3)cv2.imshow('median',rec_img)
cv2.waitKey(0)

2.2 最大值和最小值濾波

代碼:

rec_img[channel][i,j] = (np.amax(img1[channel][i:i+m,j:j+n]) + np.amin(img1[channel][i:i+m,j:j+n]))/2

對高斯噪聲處理的濾波效果:

2.4 修正阿爾法均值濾波

處理方法:在鄰域 S x y S_{xy} Sxy? 內刪除 d / 2 d/2 d/2個最低灰度值和 d / 2 d/2 d/2個最高灰度值。 g R ( r , c ) g_{R}(r,c) gR?(r,c)表示 S x y S_{xy} Sxy? 中剩下的 m n ? d mn-d mn?d個像素。

d = 0 d=0 d=0: 變成算術平均濾波

d = m n ? 1 d=mn-1 d=mn?1:中值濾波

代碼:

import cv2
import random
import numpy as np
img = cv2.imread('A.png')# 產生高斯隨機數
noise = np.random.normal(0,50,size=img.size).reshape(img.shape[0],img.shape[1],img.shape[2])
# 加上噪聲
img = img + noise
img = np.clip(img,0,255)
img = img/255   # 修正阿爾法均值濾波
img1 = np.transpose(img,(2,0,1))  #轉換成[channel,H,W]形式
m = 3  #定義濾波核大小
n = 3
d = 4    #d取偶數
rec_img = np.zeros((img1.shape[0],img1.shape[1]-m+1,img1.shape[2]-n+1))
for channel in range(rec_img.shape[0]):for i in range(rec_img[channel].shape[0]):for j in range(rec_img[channel].shape[1]):img2 = np.sort(np.ravel(img1[channel][i:i+m,j:j+n]))  #np.ravel():多維數組變成一維數組rec_img[channel][i,j] = (img2[int(d/2):-int(d/2)].sum())*(1/(m*n-d))
rec_img = np.transpose(rec_img,(1,2,0))cv2.imshow('alpha average',rec_img)
cv2.waitKey(0)

去噪效果:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/164931.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164931.shtml
英文地址,請注明出處:http://en.pswp.cn/news/164931.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

acwing算法基礎之數學知識--求組合數基礎版

目錄 1 基礎知識2 模板3 工程化 1 基礎知識 (一) 組合數 C n k C_n^k Cnk?的計算公式, C n k n ? ( n ? 1 ) ? ( n ? k 1 ) 1 ? 2 ? k C_n^k\frac{n\cdot(n-1)\cdots(n-k1)}{1\cdot 2\cdots k} Cnk?1?2?kn?(n?1)?(n?k1)? …

laravel-admin導出excel全部,表中無id列導出失敗

laravel-admin導出excel時,導出全部數據,但是表中沒有id字段,然后就無法導出excel; 就直接顯示 一開始我也很著急,弄了半天還是不行,然后重寫還是有問題 最后發現底層代碼排序是按照id排序的orderBy(id, a…

Unity地面交互效果——6、地形動態頂點置換和曲面細分

回到目錄 Unity置換貼圖局部距離曲面細分 大家好,我是阿趙。 ??這篇文章是我無聊的時候做了一個demo,覺得挺有趣,于是就發上來。這里面包含了4個內容:置換貼圖、頂點偏移、局部曲面細分,曲面細分按距離調整強度。 …

JVS低代碼表單設計:數據聯動詳解(多級數據級、數據回顯等)

在這信息化時代,表單作為數據的收集和展示工具,已經滲透到不同的角落。JVS低代碼對表單的設計和操作進行了不斷的優化和創新。其中,聯動回顯作為一項重要的功能,無論是多級數據級聯控制、組件的聯動控制,還是多表的數據…

【0基礎學Java第三課】-- 運算符

3. 運算符 3.1 什么是運算符3.2 算術運算符3.2.1 **基本四則運算符:加減乘除模( - * / %)**3.2.2 增量運算符 - * %3.2.3 自增/自減運算符 -- 3.3 關系運算符3.4邏輯運算符(重點)3.4.1 邏輯與 &&3.4.2 邏輯 ||3.4.3邏輯非 !3.4.4 短路求值 3.5 …

DBS note4:Buffer Management

目錄 1、介紹 2、緩沖池 3、處理頁面請求 4、LRU替換和時鐘策略 1)順序掃描性能 - LRU 5、最近最常使用替換策略(MRU Replacement) 1)Sequential Scanning Performance - MRU 6、練習題 1)判斷真假 2&#xf…

華清遠見嵌入式學習——網絡編程——作業4

作業要求&#xff1a;①使用IO多路復用中的select函數實現TCP并發服務器客戶端 ②使用IO多路復用中的poll函數實現TCP并發服務器的服務器端 一、 代碼 #include <myhead.h>#define SERPORT 8888 //服務器端口號 #define SERIP "192.168.114.113"…

Samsung下origen中uboot的配置與編譯

uboot的特點&#xff1a; n代碼結構清晰 n 支持豐富的處理器與開發板&#xff0c;易于移植 n 支持豐富的用戶命令 n 支持豐富的網絡協議 n 支持豐富的文件系統 n 支持豐富的設備驅動 n 更新活躍、用戶較多、資料豐富 n 開放源代碼 n 較高的穩定性 n 不具有通用性&#xff08;不…

JavaScript編程基礎 – 布爾值(Booleans)

JavaScript編程基礎 – 布爾值(Booleans) Javascript Programming Essentials – Booleans 一個JavaScript布爾值包含兩個值中的一個&#xff0c;即 true 或者 false。 本文簡要介紹JavaScript布爾值的具體應用&#xff0c;以及可能作為對象的布爾值等。 1. 布爾值(Booleans)…

Go語言超全詳解(入門級)

文章目錄 1. Go語言的出現2. go版本的hello world3. 數據類型3.0 定義變量3.0.1 如果變量沒有初始化3.0.2 如果變量沒有指定類型3.0.3 :符號3.0.4 多變量聲明3.0.5 匿名變量3.0.6 變量作用域 3.1 基本類型3.2 指針3.2.1 指針聲明和初始化3.2.2 空指針 3.3 數組3.3.1 聲明數組3.…

java+mysql的校園兼職微信小程序(附源碼 調試 文檔)

校園兼職微信小程序 摘要一、引言二、國內外研究現狀三、系統設計四、系統實現與界面展示五、源碼獲取 摘要 本文詳述了一個基于Java和MySQL數據庫技術的校園兼職微信小程序的畢業設計。系統主要分為三種用戶角色&#xff1a;管理員、學生用戶和商家用戶。管理員擁有學生管理、…

jjwt使用說明-筆記

jjwt官網鏈接&#xff1a;https://github.com/jwtk/jjwt POM 依賴 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.12.3</version> </dependency> <dependency><grou…

華納云:linux中vsz和rss有哪些區別

在Linux中&#xff0c;VSZ(Virtual Set Size)和RSS(Resident Set Size)是兩個用于描述進程內存使用的指標&#xff0c;它們表示不同方面的內存情況。 1. VSZ&#xff08;Virtual Set Size&#xff09;: VSZ 表示進程的虛擬內存大小。 包括進程使用的所有內存&#xff0c;包括實…

Python中的函數

一、函數參數與返回值基礎知識 1、不要使用可變類型&#xff08;list等&#xff09;作為參數默認值&#xff0c;用None來代替。 參數默認值只會在函數定義階段被創建一次&#xff0c;之后無論創建多少次&#xff0c;函數內拿到的默認值都是同一個對象&#xff0c;為規避這個問…

Vue 2.0源碼分析-數據驅動

Vue.js 一個核心思想是數據驅動。所謂數據驅動&#xff0c;是指視圖是由數據驅動生成的&#xff0c;我們對視圖的修改&#xff0c;不會直接操作 DOM&#xff0c;而是通過修改數據。它相比我們傳統的前端開發&#xff0c;如使用 jQuery 等前端庫直接修改 DOM&#xff0c;大大簡化…

【python學習】基礎篇-常用模塊-collections模塊:數據結構,如列表、元組、字典和集合等

Python中的collections模塊提供了一些有用的數據結構&#xff0c;如列表、元組、字典和集合等。 以下是collections模塊中一些常用數據結構的用法&#xff1a; Counter類 Counter類是一個字典子類&#xff0c;用于計數可哈希對象。 它可以接受一個可迭代對象作為參數&#xff…

Atlassian Confluence 路徑遍歷和命令執行漏洞 (CVE-2019-3396)

漏洞描述 Confluence 是由澳大利亞軟件公司 Atlassian 開發的基于 Web 的企業 wiki。 Atlassian Confluence 6.14.2 版本之前存在一個未經授權的目錄遍歷漏洞&#xff0c;攻擊者可以使用 Velocity 模板注入讀取任意文件或執行任意命令。 漏洞環境及漏洞利用 啟動docker環境…

快來考試拿證書!KubeSphere 個人技能專業考試認證上線啦!

以容器技術和容器編排為基礎的云原生應用&#xff0c;被越來越多的企業用戶接受和使用&#xff0c;并且在生產環境中使用容器技術的比例逐年增加。Kubernetes 無疑已經成為容器編排的事實基礎&#xff0c;而依托于 Kubernetes 開發的開源容器平臺 KubeSphere 也收獲了一眾擁躉。…

vue3使用provider+ inject直接將參數由祖宗傳送給孫子

如題。在vue項目中&#xff0c;如果祖宗想將參數傳遞給孫子甚至更小一輩的組件&#xff0c;是一件麻煩事。可以通過爺爺-兒子-孫子-曾孫這樣的鏈條&#xff0c;一輩輩地傳承下去&#xff0c;但未免太繁瑣、太蠢了些&#xff1b;也可以通過store間接傳送&#xff0c;但如何觸發孫…

9-什么是迭代器,生成器,裝飾器、django的信號用過嗎?如何用,干過什么、什么是深拷貝,什么是淺拷貝,如何使用、slice操作符和list構造函數

1 什么是迭代器&#xff0c;生成器&#xff0c;裝飾器 2 django的信號用過嗎&#xff1f;如何用&#xff0c;干過什么 3 什么是深拷貝&#xff0c;什么是淺拷貝&#xff0c;如何使用 3.1 淺拷貝 3.2 深拷貝 3.3 擴展(slice操作符和list構造函數) 1 什么是迭代器&#xff0c;生成…