Opencv圖像添加椒鹽噪聲、高斯濾波去除噪聲原理以及手寫(xiě)Python代碼實(shí)現(xiàn)方法
一、噪聲
我們將常會(huì)聽(tīng)到平滑(去噪),銳化(和平滑是相反的),那我們就會(huì)有疑惑?什么是噪聲呢?圖像噪聲是指存在于圖像數(shù)據(jù)中不必要的或多余的干擾信息,噪聲的存在嚴(yán)重影響了圖像的質(zhì)量。噪聲在理論上是”不可預(yù)測(cè)“的,所以我們只能用概率論方法認(rèn)識(shí)“隨機(jī)誤差”。
二、噪聲的分類(lèi)
光電管的噪聲、攝像管噪聲、攝像機(jī)噪聲、椒鹽噪聲(數(shù)字圖像常見(jiàn)的噪聲,椒鹽噪聲就是在圖像上隨機(jī)出現(xiàn)黑色白色的像素)等等。
三、圖像中添加椒鹽噪聲
椒鹽噪聲又被稱(chēng)作脈沖噪聲,它會(huì)隨機(jī)改變圖像中的像素值,是由相機(jī)成像、圖像傳輸、解碼處理等過(guò)程產(chǎn)生的黑白相間的亮暗點(diǎn)噪聲,其樣子就像在圖像上隨機(jī)的撒上一些鹽粒和黑椒粒,因此被稱(chēng)為椒鹽噪聲。
代碼如下:
import numpy as np import cv2 def cv_show(name,img): cv2.imshow(name,img) cv2.waitKey(0) cv2.destroyAllWindows() def add_sp_noise(img,sp_number): new_image=img row,col,channel=img.shape#獲取行列,通道信息 s=int(sp_number*img.size/channel)#根據(jù)sp_number確定椒鹽噪聲 #確定要掃椒鹽的像素值 change=np.concatenate((np.random.randint(0,row,size=(s,1)),np.random.randint(0,col,size=(s,1))),axis=1) for i in range(s): r=np.random.randint(0,2)#確定撒椒(0)還是鹽(1) for j in range(channel): new_image[change[i,0],change[i,1],j]=r return new_image
注意:在進(jìn)行實(shí)驗(yàn)的時(shí)候,我們需要注意要進(jìn)行拷貝不然原圖會(huì)被破壞。
測(cè)試:
img=cv2.imread("C:/Users/bwy/Desktop/peppers.JPG") im=img.copy() im2=img.copy() im3=img.copy() im=add_sp_noise(im,0.05) im2=add_sp_noise(im2,0.1) im3=add_sp_noise(im3,0.3) r=np.hstack((img,im,im2,im3)) cv_show('r',r)
結(jié)果如圖所示:
從圖上看出,sp_number越大,噪聲點(diǎn)越多。
四、基于濾波器方法去噪
高斯濾波(手寫(xiě)代碼):濾掉噪聲的代價(jià)就是圖像會(huì)有所模糊。
計(jì)算過(guò)程:
此時(shí)還要確保這九個(gè)點(diǎn)加起來(lái)為1(高斯模板的特性),這9個(gè)點(diǎn)的權(quán)重為0.4787147,因此將9個(gè)值都除以0.4787147,得到最終的高斯模板。
再與圖像像素進(jìn)行乘積,四周加和代替中間的。
(1)灰度圖像高斯濾波:
def gaosi_f(img,k_size,sigma): ##濾波圖片的尺寸 h=img.shape[0] w=img.shape[1] ##用0填充邊緣 pad=k_size//2 transform_img=np.zeros((h+2*pad,w+2*pad)) transform_img[pad:h+pad,pad:w+pad]=img new_img=np.zeros((h,w)) ##先計(jì)算高斯濾波核 gaosi_filter=np.zeros((k_size,k_size)) for x in range(-pad,-pad+k_size): for y in range(-pad,-pad+k_size): gaosi_filter[y+pad,x+pad]=np.exp(-(x**2+y**2)/(2*sigma**2))/(2*np.pi*sigma**2) gaosi_filter=gaosi_filter/np.sum(gaosi_filter) ##計(jì)算濾波后的圖片 for i in range(pad,h+pad): for j in range(pad,w+pad): ##取圖像k_size x k_size的像素值 p_img=transform_img[i-pad:i+pad+1,j-pad:j+pad+1] ##進(jìn)行高斯濾波 value=np.sum(np.multiply(p_img,gaosi_filter)) new_img[i-pad,j-pad]=value ##對(duì)濾波后的圖片中的像素值取整 new_img=np.round(new_img).astype(np.uint8) return new_img
彩色圖像高斯濾波:
def gaosi_fS(img,k_size,sigma): h=img.shape[0] w=img.shape[1] imShape=img.shape dim=len(imShape) if dim==2: eim=gaosi_f(img,k_size,sigma) else: imR=img[:,:,0] imG=img[:,:,1] imB=img[:,:,2] eim=np.zeros((h,w,3)) eimr=gaosi_f(imR,k_size,sigma) eimg=gaosi_f(imG,k_size,sigma) eimb=gaosi_f(imB,k_size,sigma) eim[:,:,0]=eimr eim[:,:,1]=eimg eim[:,:,2]=eimb return eim
測(cè)試:
new_img=gaosi_fS(im,3,0.5) cv_show("new_img",new_img) cv_show("im",im)
結(jié)果如圖所示:
五、opencv高斯濾波調(diào)包
aussian = cv2.GaussianBlur(im, (5,5), 1) cv_show("aussian",aussian)
結(jié)果如圖所示:
總結(jié)
到此這篇關(guān)于Opencv圖像添加椒鹽噪聲、高斯濾波去除噪聲原理以及手寫(xiě)Python代碼實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)Opencv添加椒鹽噪聲高斯濾波去除噪聲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)CART決策樹(shù)算法及詳細(xì)注釋
CART算法是一種樹(shù)構(gòu)建算法,既可以用于分類(lèi)任務(wù),又可以用于回歸,本文僅討論基本的CART分類(lèi)決策樹(shù)構(gòu)建,不討論回歸樹(shù)和剪枝等問(wèn)題,感興趣的朋友跟隨小編一起看看吧2021-10-10django js實(shí)現(xiàn)部分頁(yè)面刷新的示例代碼
今天小編就為大家分享一篇django js實(shí)現(xiàn)部分頁(yè)面刷新的示例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05Pytorch中torch.nn.Softmax的dim參數(shù)用法說(shuō)明
這篇文章主要介紹了Pytorch中torch.nn.Softmax的dim參數(shù)用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06Python利用正則表達(dá)式實(shí)現(xiàn)計(jì)算器算法思路解析
這篇文章主要介紹了Python利用正則表達(dá)式實(shí)現(xiàn)計(jì)算器算法思路解析,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2018-04-04微信公眾號(hào)腳本-獲取熱搜自動(dòng)新建草稿并發(fā)布文章
本來(lái)想寫(xiě)一個(gè)自動(dòng)化發(fā)布微信公眾號(hào)的小綠書(shū)的腳本,但是微信公眾號(hào)官網(wǎng)沒(méi)有小綠書(shū)的接口,那就寫(xiě)一個(gè)獲取熱搜微信普通文章的腳本吧,這篇文章主要介紹了微信公眾號(hào)腳本-獲取熱搜自動(dòng)新建草稿并發(fā)布文章2025-04-04Python try-except-else-finally的具體使用
本文主要介紹了Python try-except-else-finally的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08