OpenCV學(xué)習(xí)之圖像加噪與濾波的實現(xiàn)詳解
一、實驗內(nèi)容
編寫一Python程序,要求實現(xiàn)以下功能:
- 讀入一幅圖像。
- 使用兩種以上的方法分別向圖像中添加噪聲。
- 輸出一幅二值圖像,圖像中未加入噪聲的區(qū)域為黑色,加入噪聲的區(qū)域為白色。
- 使用三種濾波方法對上述添加了噪聲的圖像進行濾波處理。
- 輸出濾波處理后的圖像。
撰寫實驗報告,將上述處理的原理與處理流程進行介紹;并添加原圖、加入噪聲的圖像、描述噪聲位置的二值圖像以及三種濾波方法處理后的圖像;最終對處理結(jié)果進行分析,并附加程序。
二、實驗環(huán)境和配置
解釋器:Python3.9、開發(fā)環(huán)境:PyCharm
三、實驗原理及操作
實驗中我們使用opencv中imread讀入圖片,imwrite保存圖片。
1. 添加噪聲
在本次實驗中使用到的兩種噪聲分別為椒鹽噪聲及白噪聲。
椒鹽噪聲是將圖片中一定比例的像素點隨機置為0或255,使圖片上隨機分布黑色和白色的噪聲點。 實驗中,我們建立一閾值參數(shù)per(添加噪聲的比例),隨機生成與輸入圖片相同尺寸的0到1的隨機數(shù)矩陣,記錄隨機數(shù)矩陣中小于per/2和處于per/2與per之間的元素位置。將原圖像中與矩陣小于per/2對應(yīng)位置相同的像素置為255,處于per/2與per之間的置為0,這就完成為圖像添加椒鹽噪聲。
白噪聲與椒鹽噪聲類似,不同的是椒鹽噪聲可能添加黑色或白色的噪聲點,而白噪聲只會添加白色噪聲點。實驗中,我們同樣建立一閾值比例參數(shù)per,與輸入圖片尺寸相同的0到1的隨機矩陣,將矩陣中小于per的元素對應(yīng)位置的原圖像素點置為255,這就完成了對圖像添加白噪聲。
2.噪聲二值化
實驗中將我們將原圖與添加噪聲后的圖片進行減法操作,未添加噪聲點的部分即為原始像素與原始像素相減,得到的值為0(黑色)。添加噪聲點的部分為噪聲點與原始圖像相減,無規(guī)律的某一特殊值。之后將非0點認(rèn)定為噪聲點所在位置,使用二值化操作將非0點置為255(白色),0點仍保持為0(黑色),這就實現(xiàn)了輸出標(biāo)志位置信息的二值圖像。
3. 濾波處理
實驗中使用均值濾波、中值濾波、高斯濾波對添加噪聲后的圖像進行處理。
均值濾波是將濾波器中心的像素點替換為處于濾波器中全部像素點的均值,使用opencv中blur實現(xiàn);中值濾波是將濾波器中心的像素點替換為處于濾波器中全部像素點的中值,使用opencv中medianBlur實現(xiàn);高斯濾波的濾波器參數(shù)與離中心像素的距離有關(guān),其參數(shù)符合高斯分布,使用opencv中GaussianBlur實現(xiàn)。使用濾波器在原圖像進行掃描,以實現(xiàn)降噪等目的。
四、實驗結(jié)果
1.原圖、添加椒鹽噪聲、添加白噪聲對比
圖1 原圖(上)、添加椒鹽噪聲(中)、添加白噪聲(下)對比圖
2.椒鹽噪聲二值圖與白噪聲二值圖
椒鹽噪聲二值圖(per=0.02)與白噪聲二值圖(per=0.05)
3.椒鹽噪聲處理圖經(jīng)處理后圖像
椒鹽噪聲處理圖經(jīng)均值濾波(上)、中值濾波(中)、高斯濾波(下)后圖像:
4.白噪聲處理圖經(jīng)處理后圖像
白噪聲處理圖經(jīng)均值濾波(上)、中值濾波(中)、高斯濾波(下)后圖像
五、結(jié)果分析
由圖1可知,對原圖像添加噪聲后,添加椒鹽噪聲的圖像上呈現(xiàn)出不規(guī)律的黑白像素點,添加白噪聲的圖像上呈現(xiàn)出不規(guī)律的白色像素點,說明添加噪聲成功。
從運行結(jié)果可以得出低通濾波操作可對圖像進行降噪處理。其中中值濾波對椒鹽噪聲和白噪聲降噪效果顯著,原因是椒鹽噪聲點和白噪聲點與周圍像素點差異較大,當(dāng)有中值濾波器經(jīng)過時會將偏差值較大的點(黑噪聲和白噪聲)置為濾波器中的中值,這就過濾了這些差異較大的點,實現(xiàn)了圖像降噪。椒鹽噪聲點和白噪聲點經(jīng)均值濾波與高斯濾波后噪聲點顏色變淡、面積變大,是因為這兩種濾波相當(dāng)于對處于濾波器中的像素值進行加權(quán)求和,當(dāng)噪聲點被濾波器處理時,與周圍像素加權(quán)求和,噪聲顏色變淺;當(dāng)處理的像素點周圍有噪聲時,與噪聲點加權(quá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ū)域為白色 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ū)域為白色 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) # 使用圖像減法與二值化處理獲取噪聲點 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í)之圖像加噪與濾波的實現(xiàn)詳解的詳細(xì)內(nèi)容,更多關(guān)于OpenCV圖像加噪濾波的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
PyCharm使用Docker鏡像搭建Python開發(fā)環(huán)境
這篇文章主要介紹了PyCharm使用Docker鏡像搭建Python開發(fā)環(huán)境,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12Python實現(xiàn)查找數(shù)據(jù)庫最接近的數(shù)據(jù)
這篇文章主要介紹了Python實現(xiàn)查找數(shù)據(jù)庫最接近的數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-0650行Python代碼獲取高考志愿信息的實現(xiàn)方法
這篇文章主要介紹了50行Python代碼獲取高考志愿信息的實現(xiàn)方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-07-07超簡單的scrapy實現(xiàn)ip動態(tài)代理與更換ip的方法實現(xiàn)
這篇文章主要介紹了超簡單的scrapy實現(xiàn)ip動態(tài)代理與更換ip的方法實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03