OpenCV學(xué)習(xí)之圖像加噪與濾波的實(shí)現(xiàn)詳解
一、實(shí)驗(yàn)內(nèi)容
編寫一Python程序,要求實(shí)現(xiàn)以下功能:
- 讀入一幅圖像。
- 使用兩種以上的方法分別向圖像中添加噪聲。
- 輸出一幅二值圖像,圖像中未加入噪聲的區(qū)域?yàn)楹谏尤朐肼暤膮^(qū)域?yàn)榘咨?/li>
- 使用三種濾波方法對(duì)上述添加了噪聲的圖像進(jìn)行濾波處理。
- 輸出濾波處理后的圖像。
撰寫實(shí)驗(yàn)報(bào)告,將上述處理的原理與處理流程進(jìn)行介紹;并添加原圖、加入噪聲的圖像、描述噪聲位置的二值圖像以及三種濾波方法處理后的圖像;最終對(duì)處理結(jié)果進(jìn)行分析,并附加程序。
二、實(shí)驗(yàn)環(huán)境和配置
解釋器:Python3.9、開發(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)與原始圖像相減,無規(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),說明添加噪聲成功。
從運(yùn)行結(jié)果可以得出低通濾波操作可對(duì)圖像進(jìn)行降噪處理。其中中值濾波對(duì)椒鹽噪聲和白噪聲降噪效果顯著,原因是椒鹽噪聲點(diǎn)和白噪聲點(diǎn)與周圍像素點(diǎn)差異較大,當(dāng)有中值濾波器經(jīng)過時(shí)會(huì)將偏差值較大的點(diǎn)(黑噪聲和白噪聲)置為濾波器中的中值,這就過濾了這些差異較大的點(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()來作為椒鹽噪聲 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()來作為白噪聲 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)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-10-10PyCharm使用Docker鏡像搭建Python開發(fā)環(huán)境
這篇文章主要介紹了PyCharm使用Docker鏡像搭建Python開發(fā)環(huán)境,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12JavaScript中的模擬事件和自定義事件實(shí)例分析
這篇文章主要介紹了JavaScript中的模擬事件和自定義事件,結(jié)合實(shí)例形式分析了JavaScript模擬事件和自定義事件相關(guān)操作步驟、實(shí)現(xiàn)技巧與注意事項(xiàng),需要的朋友可以參考下2018-07-07Python實(shí)現(xiàn)查找數(shù)據(jù)庫最接近的數(shù)據(jù)
這篇文章主要介紹了Python實(shí)現(xiàn)查找數(shù)據(jù)庫最接近的數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06Python 實(shí)現(xiàn)RSA加解密文本文件
這篇文章主要介紹了Python 實(shí)現(xiàn)RSA加解密文本文件的方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-12-1250行Python代碼獲取高考志愿信息的實(shí)現(xiàn)方法
這篇文章主要介紹了50行Python代碼獲取高考志愿信息的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07Python三元運(yùn)算與lambda表達(dá)式實(shí)例解析
這篇文章主要介紹了Python三元運(yùn)算與lambda表達(dá)式實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11超簡單的scrapy實(shí)現(xiàn)ip動(dòng)態(tài)代理與更換ip的方法實(shí)現(xiàn)
這篇文章主要介紹了超簡單的scrapy實(shí)現(xiàn)ip動(dòng)態(tài)代理與更換ip的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03