OpenCV學(xué)習(xí)之圖像加噪與濾波的實(shí)現(xiàn)詳解
一、實(shí)驗(yàn)內(nèi)容
編寫(xiě)一Python程序,要求實(shí)現(xiàn)以下功能:
- 讀入一幅圖像。
- 使用兩種以上的方法分別向圖像中添加噪聲。
- 輸出一幅二值圖像,圖像中未加入噪聲的區(qū)域?yàn)楹谏?,加入噪聲的區(qū)域?yàn)榘咨?/li>
- 使用三種濾波方法對(duì)上述添加了噪聲的圖像進(jìn)行濾波處理。
- 輸出濾波處理后的圖像。
撰寫(xiě)實(shí)驗(yàn)報(bào)告,將上述處理的原理與處理流程進(jìn)行介紹;并添加原圖、加入噪聲的圖像、描述噪聲位置的二值圖像以及三種濾波方法處理后的圖像;最終對(duì)處理結(jié)果進(jìn)行分析,并附加程序。
二、實(shí)驗(yàn)環(huán)境和配置
解釋器:Python3.9、開(kāi)發(fā)環(huán)境:PyCharm
三、實(shí)驗(yàn)原理及操作
實(shí)驗(yàn)中我們使用opencv中imread讀入圖片,imwrite保存圖片。
1. 添加噪聲
在本次實(shí)驗(yàn)中使用到的兩種噪聲分別為椒鹽噪聲及白噪聲。
椒鹽噪聲是將圖片中一定比例的像素點(diǎn)隨機(jī)置為0或255,使圖片上隨機(jī)分布黑色和白色的噪聲點(diǎn)。 實(shí)驗(yàn)中,我們建立一閾值參數(shù)per(添加噪聲的比例),隨機(jī)生成與輸入圖片相同尺寸的0到1的隨機(jī)數(shù)矩陣,記錄隨機(jī)數(shù)矩陣中小于per/2和處于per/2與per之間的元素位置。將原圖像中與矩陣小于per/2對(duì)應(yīng)位置相同的像素置為255,處于per/2與per之間的置為0,這就完成為圖像添加椒鹽噪聲。
白噪聲與椒鹽噪聲類似,不同的是椒鹽噪聲可能添加黑色或白色的噪聲點(diǎn),而白噪聲只會(huì)添加白色噪聲點(diǎn)。實(shí)驗(yàn)中,我們同樣建立一閾值比例參數(shù)per,與輸入圖片尺寸相同的0到1的隨機(jī)矩陣,將矩陣中小于per的元素對(duì)應(yīng)位置的原圖像素點(diǎn)置為255,這就完成了對(duì)圖像添加白噪聲。
2.噪聲二值化
實(shí)驗(yàn)中將我們將原圖與添加噪聲后的圖片進(jìn)行減法操作,未添加噪聲點(diǎn)的部分即為原始像素與原始像素相減,得到的值為0(黑色)。添加噪聲點(diǎn)的部分為噪聲點(diǎn)與原始圖像相減,無(wú)規(guī)律的某一特殊值。之后將非0點(diǎn)認(rèn)定為噪聲點(diǎn)所在位置,使用二值化操作將非0點(diǎn)置為255(白色),0點(diǎn)仍保持為0(黑色),這就實(shí)現(xiàn)了輸出標(biāo)志位置信息的二值圖像。
3. 濾波處理
實(shí)驗(yàn)中使用均值濾波、中值濾波、高斯濾波對(duì)添加噪聲后的圖像進(jìn)行處理。
均值濾波是將濾波器中心的像素點(diǎn)替換為處于濾波器中全部像素點(diǎn)的均值,使用opencv中blur實(shí)現(xiàn);中值濾波是將濾波器中心的像素點(diǎn)替換為處于濾波器中全部像素點(diǎn)的中值,使用opencv中medianBlur實(shí)現(xiàn);高斯濾波的濾波器參數(shù)與離中心像素的距離有關(guān),其參數(shù)符合高斯分布,使用opencv中GaussianBlur實(shí)現(xiàn)。使用濾波器在原圖像進(jìn)行掃描,以實(shí)現(xiàn)降噪等目的。
四、實(shí)驗(yàn)結(jié)果
1.原圖、添加椒鹽噪聲、添加白噪聲對(duì)比
圖1 原圖(上)、添加椒鹽噪聲(中)、添加白噪聲(下)對(duì)比圖



2.椒鹽噪聲二值圖與白噪聲二值圖
椒鹽噪聲二值圖(per=0.02)與白噪聲二值圖(per=0.05)


3.椒鹽噪聲處理圖經(jīng)處理后圖像
椒鹽噪聲處理圖經(jīng)均值濾波(上)、中值濾波(中)、高斯濾波(下)后圖像:



4.白噪聲處理圖經(jīng)處理后圖像
白噪聲處理圖經(jīng)均值濾波(上)、中值濾波(中)、高斯濾波(下)后圖像



五、結(jié)果分析
由圖1可知,對(duì)原圖像添加噪聲后,添加椒鹽噪聲的圖像上呈現(xiàn)出不規(guī)律的黑白像素點(diǎn),添加白噪聲的圖像上呈現(xiàn)出不規(guī)律的白色像素點(diǎn),說(shuō)明添加噪聲成功。
從運(yùn)行結(jié)果可以得出低通濾波操作可對(duì)圖像進(jìn)行降噪處理。其中中值濾波對(duì)椒鹽噪聲和白噪聲降噪效果顯著,原因是椒鹽噪聲點(diǎn)和白噪聲點(diǎn)與周圍像素點(diǎn)差異較大,當(dāng)有中值濾波器經(jīng)過(guò)時(shí)會(huì)將偏差值較大的點(diǎn)(黑噪聲和白噪聲)置為濾波器中的中值,這就過(guò)濾了這些差異較大的點(diǎn),實(shí)現(xiàn)了圖像降噪。椒鹽噪聲點(diǎn)和白噪聲點(diǎn)經(jīng)均值濾波與高斯濾波后噪聲點(diǎn)顏色變淡、面積變大,是因?yàn)檫@兩種濾波相當(dāng)于對(duì)處于濾波器中的像素值進(jìn)行加權(quán)求和,當(dāng)噪聲點(diǎn)被濾波器處理時(shí),與周圍像素加權(quán)求和,噪聲顏色變淺;當(dāng)處理的像素點(diǎn)周圍有噪聲時(shí),與噪聲點(diǎn)加權(quán)求和,該像素點(diǎn)被“污染”,噪聲點(diǎn)變大。
六、實(shí)驗(yàn)源碼
# @Time : 2022/10/10 16:29
# @Author : 是Dream呀
# @File : 圖像加噪與濾波.py
import cv2 as cv
import numpy as np
img = cv.imread('photo.jpg')
cv.imshow('test',img)
cv.waitKey(0)
cv.destroyAllWindows()
# 定義sp_Noise()來(lái)作為椒鹽噪聲
def sp_Noise(image, per):
img = image.copy()
threshold = per/2
w,h = img.shape[0], img.shape[1]
rand = np.random.random([w,h])
# 標(biāo)注噪聲區(qū)域的二值圖像,背景為黑色,噪聲區(qū)域?yàn)榘咨?
noise = np.zeros(img.shape)
noise[rand<per] = 1
img[rand<threshold] = 0
img[(rand<per) & (rand>=threshold)] = 255
return noise*255,img
# 定義white_Noise()來(lái)作為白噪聲
def white_Noise(image, per):
img = image.copy()
w,h = img.shape[0], img.shape[1]
rand = np.random.random([w,h])
# 標(biāo)注噪聲區(qū)域的二值圖像,背景為黑色,噪聲區(qū)域?yàn)榘咨?
noise = np.zeros(img.shape)
noise[rand < per] = 1
img[rand < per] = 255
return noise*255, img
white_noise, white_img = white_Noise(img, 0.05)
sp_noise, sp_img = sp_Noise(img, 0.02)
# 使用圖像減法與二值化處理獲取噪聲點(diǎn)
sp_noise1 = np.float32(sp_img) - np.float32(img)
sp_noise1 = np.where(sp_noise1 == 0, 0, 255)
sp_noise1 = np.uint8(sp_noise1)
white_noise1 = np.float32(white_img) - np.float32(img)
white_noise1 = np.where(white_noise1 == 0, 0, 255)
white_noise1 = np.uint8(white_noise1)
cv.imshow('white_noise1',white_noise1)
cv.imshow('sp_noise1',sp_noise1)
cv.waitKey(0)
cv.destroyAllWindows()
cv.imshow('img',img)
cv.imshow('white_img',white_img)
cv.imshow('sp_img',sp_img)
# cv.imshow('white_noise',white_noise)
# cv.imshow('sp_noise',sp_noise)
cv.waitKey(0)
cv.destroyAllWindows()
img_sp_blur = cv.blur(sp_img,(3,3))
img_white_blur = cv.blur(white_img,(3,3))
cv.imshow('img',img)
cv.imshow('white_img',white_img)
cv.imshow('sp_img',sp_img)
cv.imshow('img_sp_blur',img_sp_blur)
cv.imshow('img_white_blur',img_white_blur)
cv.waitKey(0)
cv.destroyAllWindows()
img_sp_med = cv.medianBlur(sp_img, 3)
img_white_med = cv.medianBlur(white_img, 3)
cv.imshow('img',img)
cv.imshow('white_img',white_img)
cv.imshow('sp_img',sp_img)
cv.imshow('img_sp_med',img_sp_med)
cv.imshow('img_white_med',img_white_med)
cv.waitKey(0)
cv.destroyAllWindows()
img_sp_gs = cv.GaussianBlur(sp_img,(5,5),1)
img_white_gs = cv.GaussianBlur(white_img,(5,5),1)
cv.imshow('img',img)
cv.imshow('white_img',white_img)
cv.imshow('sp_img',sp_img)
cv.imshow('img_sp_gs',img_sp_gs)
cv.imshow('img_white_gs',img_white_gs)
cv.waitKey(0)
cv.destroyAllWindows()
cv.imwrite('white_noise1.jpg',white_noise1)
cv.imwrite('sp_noise1.jpg',sp_noise1)
cv.imwrite('white_img.jpg',white_img)
cv.imwrite('sp_img.jpg',sp_img)
cv.imwrite('img_sp_blur.jpg',img_sp_blur)
cv.imwrite('img_white_blur.jpg',img_white_blur)
cv.imwrite('img_sp_med.jpg',img_sp_med)
cv.imwrite('img_white_med.jpg',img_white_med)
cv.imwrite('img_sp_gs.jpg',img_sp_gs)
cv.imwrite('img_white_gs.jpg',img_white_gs)
dx = cv.Sobel(sp_img,-1,1,0,3)
dy = cv.Sobel(sp_img,-1,0,1,3)
d = cv.addWeighted(dx,0.5,dy,0.5,0)
d = cv.convertScaleAbs(d)
cv.imshow('img_gs_med',d)
cv.waitKey(0)
cv.destroyAllWindows()
以上就是OpenCV學(xué)習(xí)之圖像加噪與濾波的實(shí)現(xiàn)詳解的詳細(xì)內(nèi)容,更多關(guān)于OpenCV圖像加噪濾波的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python 多進(jìn)程和數(shù)據(jù)傳遞的理解
這篇文章主要介紹了Python 多進(jìn)程和數(shù)據(jù)傳遞的理解的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下2017-10-10
PyCharm使用Docker鏡像搭建Python開(kāi)發(fā)環(huán)境
這篇文章主要介紹了PyCharm使用Docker鏡像搭建Python開(kāi)發(fā)環(huán)境,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
JavaScript中的模擬事件和自定義事件實(shí)例分析
這篇文章主要介紹了JavaScript中的模擬事件和自定義事件,結(jié)合實(shí)例形式分析了JavaScript模擬事件和自定義事件相關(guān)操作步驟、實(shí)現(xiàn)技巧與注意事項(xiàng),需要的朋友可以參考下2018-07-07
Python實(shí)現(xiàn)查找數(shù)據(jù)庫(kù)最接近的數(shù)據(jù)
這篇文章主要介紹了Python實(shí)現(xiàn)查找數(shù)據(jù)庫(kù)最接近的數(shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
Python 實(shí)現(xiàn)RSA加解密文本文件
這篇文章主要介紹了Python 實(shí)現(xiàn)RSA加解密文本文件的方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-12-12
50行Python代碼獲取高考志愿信息的實(shí)現(xiàn)方法
這篇文章主要介紹了50行Python代碼獲取高考志愿信息的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07
Python三元運(yùn)算與lambda表達(dá)式實(shí)例解析
這篇文章主要介紹了Python三元運(yùn)算與lambda表達(dá)式實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
超簡(jiǎn)單的scrapy實(shí)現(xiàn)ip動(dòng)態(tài)代理與更換ip的方法實(shí)現(xiàn)
這篇文章主要介紹了超簡(jiǎn)單的scrapy實(shí)現(xiàn)ip動(dòng)態(tài)代理與更換ip的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03

