OpenCV中的模糊处理(python)
OpenCV中的模糊處理
- 前言
- 1、寫在模糊理解前
- 1.1什么是卷積
- 1.2濾波器
- 2、模糊方式
- 2.1均值模糊(濾波)
- 2.2中值模糊
- 2.3高斯模糊
- 總結(jié)
前言
接到考核任務(wù)。
在學(xué)OpenCV模糊處理這方面,顧名思義,模糊處理是使圖片變的模糊,在學(xué)習(xí)過程中發(fā)現(xiàn)有很多種模糊且有一堆聽著十分有逼格的名字,公式也讓初學(xué)的我看著頭大,硬著頭皮學(xué)下去。在網(wǎng)上查閱了很多相關(guān)資料,大部分都是一上來就十分高大上,門檻十分高,讓我望而卻步,只能自己一步步查,從底層開始了解,并理解好通俗的表達(dá)出來,致力于讓每一個(gè)像我一樣的零基礎(chǔ)學(xué)習(xí)愛好者能保持熱愛。同時(shí)也能督促我自己能好好理解。
學(xué)習(xí)模糊之前,一開始完全看不懂長篇大論的講解,但發(fā)現(xiàn)主要的核心關(guān)鍵點(diǎn)都落在“卷積”上,所以在學(xué)模糊處理之前,最起碼我們要有個(gè)“卷積”的概念,所以加入了“卷積”的理解。
1、寫在模糊理解前
1.1什么是卷積
百度百科中的解釋:
看了=沒看
在知乎看了排名前三的高贊回答,算是對卷積有所了解。
把鏈接放這
如何通俗易懂的解釋“卷積”
了解卷積之后
二維卷積的操作時(shí)從卷積核開始,這是一個(gè)小的權(quán)值矩陣。這個(gè)卷積核在 二維輸入數(shù)據(jù)上「滑動(dòng)」,對當(dāng)前輸入的部分元素進(jìn)行矩陣乘法,然后將結(jié)果匯為單個(gè)輸出像素。如下圖所示:
將以上的運(yùn)算規(guī)則運(yùn)用到如下圖便可驗(yàn)證
一個(gè)標(biāo)準(zhǔn)的卷積
卷積核重復(fù)這個(gè)過程知道遍歷了整張圖片,將一個(gè)二維矩陣轉(zhuǎn)換為另一個(gè)二維矩陣。輸出特征實(shí)質(zhì)上是在輸入數(shù)據(jù)相同位置上的加權(quán)和(權(quán)值是卷積核本身的值)
輸入數(shù)據(jù)是否落入這個(gè)「大致相似區(qū)域」,直接決定了數(shù)據(jù)經(jīng)過卷積核后的輸出。這意味著卷積核的尺寸直接決定了生成新的特征時(shí)匯合了多少(或幾個(gè))輸入特征。
這與全連接層完全相反。在上面的例子中,我們的輸入特征為 55=25,輸出數(shù)據(jù)為 33=9. 如果我們使用標(biāo)準(zhǔn)的全連接層,就會(huì)產(chǎn)生一個(gè)25*9=225 個(gè)參數(shù)的權(quán)值矩陣,每個(gè)輸出都是所有輸入數(shù)據(jù)的加權(quán)求和。卷積操作允許我們只用 9個(gè)參數(shù)來實(shí)現(xiàn)這個(gè)變換,每個(gè)輸出特性不用「查看」每個(gè)輸入特征,而是只是「查看」來自大致相同位置的輸入特征。
一些常用的技術(shù)
在我們繼續(xù)介紹卷積神經(jīng)網(wǎng)絡(luò)之前,介紹兩種卷積層中常用的技術(shù):Padding 和 Strides
Padding:如果你看到上面的動(dòng)畫,那么會(huì)注意到在卷積核滑動(dòng)的過程中,邊緣基本會(huì)被「裁剪」掉,將 55 特征矩陣轉(zhuǎn)換為 33的特征矩陣。邊緣上的像素永遠(yuǎn)不在卷積核的中心,因?yàn)閮?nèi)核沒有任何東西可以擴(kuò)展到邊緣之外。這并不理想,因?yàn)槲覀兘?jīng)常希望輸出的尺寸等于輸入。
一些 padding 操作
Padding 做了一些非常機(jī)智的辦法來解決這個(gè)問題:用額外的「假」像素(通常值為0,因此經(jīng)常使用的術(shù)語「零填充」)填充邊緣。這樣,在滑動(dòng)時(shí)的卷積核可以允許原始邊緣像素位于其中心,同時(shí)延伸到邊緣之外的假像素,從而產(chǎn)生與輸入相同大小的輸出。
Striding:運(yùn)行卷積層時(shí),我們通常希望輸出的尺寸是比輸入更低。這在卷積神經(jīng)網(wǎng)絡(luò)中是常見的,在增加信道數(shù)量的同時(shí)空間尺寸減小。其中一種方法是使用池化層(例如,取每
2×2 網(wǎng)格的平均值/最大值將空間維度減半)。還有一種方法是使用 Striding:
一個(gè)步長為 2 的卷積操作
Stride 的想法是改變卷積核的移動(dòng)步長跳過一些像素。Stride 是 1 表示卷積核滑過每一個(gè)相距是 1的像素,是最基本的單步滑動(dòng),作為標(biāo)準(zhǔn)卷積模式。Stride 是 2 表示卷積核的移動(dòng)步長是 2,跳過相鄰像素,圖像縮小為原來的1/2。Stride 是 3 表示卷積核的移動(dòng)步長是 3,跳過 2 個(gè)相鄰像素,圖像縮小為原來的 1/3。 越來越多的新網(wǎng)絡(luò)結(jié)構(gòu),比如 ResNet,已經(jīng)完全拋棄了池化層。當(dāng)需要對圖像進(jìn)行縮小時(shí)會(huì)采用 Stride 方法。
1.2濾波器
濾波器分為:高通濾波器(HPF)和低通濾波器(LPF)。
- 高通濾波器:根據(jù)像素與周圍的像素的亮度差值來提升改像素的亮度。
主要作用:銳化。 - 低通濾波器:在像素與周圍像素的亮度差值小于一個(gè)特定值時(shí),平滑改像素的亮度。
主要作用:去噪和模糊化。
以下我們討論到的均值模糊、中值模糊、高斯模糊都屬于低通濾波器
2、模糊方式
2.1均值模糊(濾波)
均值濾波從字面意思上就是取平均值,也就是小方格上的系數(shù)全是1,與覆蓋下的像素值相乘,再去除以9(卷積和大小為3*3),得到平均值,賦值給中心像素。用卷積框覆蓋區(qū)域所有像素的平均值來代替中心元素,很顯然,它的準(zhǔn)確值是降低了,也就不能很好的保留圖像細(xì)節(jié),因?yàn)槿镁荡媪恕?/p>
均值模糊函數(shù)blur():
定義:blur(src,ksize,dst=None, anchor=None, borderType=None)
定義是有5個(gè)參數(shù),但最后三個(gè)均為none,所以也就2個(gè)參數(shù)
src:要處理的原圖像
ksize: 必須是奇數(shù)卷積核,周圍關(guān)聯(lián)的像素的范圍:代碼中(5,5)就是5*5的大小,就是計(jì)算這些范圍內(nèi)的均值來確定中心位置的大小
下面用代碼直接展示,直觀感受
(考核中要求代碼方面注釋詳細(xì)[嘆氣])
是不是有了一層模糊美~
把卷積層改為
效果:
可以看到,卷積值越大,模糊程度越明顯。
以上只是直觀的感受卷積層的魅力,具體的計(jì)算還需要我慢慢去琢磨
2.2中值模糊
字面意思就是取中間的值來代替中心像素。和均值濾波類似,但均值濾波是取平均值,而中值濾波取中間的那個(gè)值。
中值濾波可以有效的去除椒鹽噪聲
這里需要解釋一下噪聲:
圖像噪聲:
圖像噪聲是圖像在獲取或者傳輸過程中受到隨機(jī)信號(hào)干擾,妨礙人們對圖像理解及分析處理的信號(hào)。很多時(shí)候?qū)D像看作隨機(jī)過程,因而描述噪聲的方法完全可以借用隨機(jī)過程的描述,即使用其概率分布函數(shù)和概率密度分布函數(shù)。圖像噪聲的產(chǎn)生來自圖像獲取中的環(huán)境條件和傳感元器件自身的質(zhì)量,圖像在傳輸過程中產(chǎn)生圖像噪聲的主要因素是所用的傳輸信道受到噪聲污染。
椒鹽噪聲:
椒鹽噪聲是數(shù)字圖像中的常見噪聲,一般是圖像傳感器、傳輸信道及解碼處理等產(chǎn)生的黑白相間的亮暗點(diǎn)噪聲,椒鹽噪聲常由圖像切割產(chǎn)生。椒鹽噪聲是指兩種噪聲:鹽噪聲和椒噪聲。鹽噪聲一般是白色噪聲,椒噪聲一般為黑色噪聲。前者屬于高灰度噪聲,或者屬于低灰度噪聲,一般兩種噪聲同時(shí)出現(xiàn),呈現(xiàn)黑白雜點(diǎn)。去除椒鹽噪聲常用的方法是中值濾波。
我簡單將圖片處理了一下加上了椒鹽噪聲
我把代碼放下面,感興趣可以試試
我們接下來用一串中值模糊的代碼來驗(yàn)證是否真的能有效去除椒鹽噪聲
中值模糊代碼如下:
嘶~確實(shí)給力啊
那么問題來了,為什么它可以去除椒鹽噪聲呢?
這是因?yàn)榻符}噪聲像素值要么很小為0,要么很大為255,而取中間值話,就會(huì)用替代這些,從而給圖像去噪點(diǎn)。從上圖中我們也可以發(fā)現(xiàn),雖然沒有噪點(diǎn)了,但也犧牲了圖像的質(zhì)量,變的模糊了。
本著質(zhì)疑的精神,為均值模糊打抱不平,想要試試我均值大哥能不能做到,直接操作,實(shí)踐出真知。
啊這…
值得注意的是:中值濾波雖然可以克服線性濾波器所帶來的圖像細(xì)節(jié)模糊,但是在線、尖頂?shù)燃?xì)節(jié)多的圖像不宜用中值濾波
2.3高斯模糊
使用opencv高斯模糊
高斯平滑函數(shù)GaussianBlur()
定義:GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)
1. src:輸入圖像,即源圖像,填Mat類的對象即可。它可以是單獨(dú)的任意通道數(shù)的圖片,但需要注意,圖片深度應(yīng)該為CV_8U,CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
2. ksize:高斯內(nèi)核的大小。其中ksize.width和ksize.height可以不同,但他們都必須為正數(shù)和奇數(shù)(并不能理解)。或者,它們可以是零的,它們都是由sigma計(jì)算而來。
3. sigmaX:表示高斯核函數(shù)在X方向的的標(biāo)準(zhǔn)偏差。根據(jù)這個(gè)可以獲取sigmaY,若是sigmaX和sigmaY都沒有則根據(jù)ksize獲取
4. dst:目標(biāo)圖像,需要和源圖片有一樣的尺寸和類型。比如可以用Mat::Clone,以源圖片為模板,來初始化得到如假包換的目標(biāo)圖。
5. sigmaY:表示高斯核函數(shù)在Y方向的的標(biāo)準(zhǔn)偏差。若sigmaY為零,就將它設(shè)為sigmaX,如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height計(jì)算出來。為了結(jié)果的正確性著想,最好是把第三個(gè)參數(shù)Size,第四個(gè)參數(shù)sigmaX和第五個(gè)參數(shù)sigmaY全部指定到。
6. borderType:用于推斷圖像外部像素的某種邊界模式。注意它有默認(rèn)值BORDER_DEFAULT。
基于此,我用一串代碼給圖片加上了高斯噪聲
import cv2 as cv import numpy as np# 定義一個(gè)各通道值 0-255范圍 超出按截?cái)嗵幚?/span> def ext(pv):if pv > 255:return 255if pv < 0:return 0else:return pv # 高斯噪點(diǎn)的生成 def gauss_noise(image):h, w, ch = image.shapefor row in range(h):for col in range(w):s = np.random.normal(0, 10, 3)#生成高斯分布的概率密度隨機(jī)數(shù)# 去除每一個(gè)像素的三個(gè)通道值b = image[row, col, 0]g = image[row, col, 1]r = image[row, col, 2]# 在每一個(gè)像素的三個(gè)通道值上加上高斯噪聲image[row, col, 0] = ext(b + s[0])image[row, col, 1] = ext(g + s[1])image[row, col, 2] = ext(r + s[2])cv.imshow("gauss_noise", image) print("--------- HL添加高斯噪聲測試 ---------") img = cv.imread("pic.jpg") cv.imshow("org", img) t1 = cv.getTickCount() gauss_noise(img) cv.waitKey(0) cv.destroyAllWindows()代碼講解(畢竟考核要求我注釋詳細(xì)…)
核心代碼:s = np.random.normal(0, 10, 3)
原型:numpy.random.normal(loc, scale, size)
將該添加了高斯噪聲的圖片,分別用均值模糊,中值模糊,高斯模糊,讓我們拭目以待。
從結(jié)果來看,面對高斯噪聲的干擾,均值模糊已經(jīng)完敗,中值模糊還能看得過去,但高斯模糊面對“家人”就顯得易如反掌了,與原圖相比,很好的去除了高斯噪聲的干擾,雖然還是犧牲了一些清晰度,但整體來說,已經(jīng)很好啦~
想再嘗試的我,用加了椒鹽噪聲的圖片讓高斯模糊去處理,想看看效果
好吧,中值勝出…
總結(jié)
以上三種模糊操作,為了方便比較,我也均采用同一張圖片進(jìn)行處理,也在實(shí)踐中體會(huì)了各種模糊的優(yōu)劣,在此在此總結(jié):
- 中值模糊在去除脈沖噪聲、斑點(diǎn)噪聲(speckle noise)、椒鹽噪聲(salt-and-pepper noise)、圖像掃描噪聲的同時(shí)又能保留凸圖像邊緣細(xì)節(jié),噪聲成分很難選上,所以幾乎不會(huì)影響到輸出,但中值濾波花費(fèi)的時(shí)間是均值濾波的5倍以上。
- 均值模糊中,由于噪聲成分被放入平均計(jì)算中,所以輸出受到了噪聲的影響。
- 高斯模糊可以應(yīng)對絕大部分的高斯噪聲的圖片,但對于椒鹽噪聲這樣的也難以抵擋,至于后續(xù),還需要鄙人的深入學(xué)習(xí)了。
總結(jié)
以上是生活随笔為你收集整理的OpenCV中的模糊处理(python)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML5 1.4 列表
- 下一篇: Python实现文件则自动分类