Python下opencv使用筆記(五)(映像的平滑與濾波)

來源:互聯網
上載者:User

標籤:python   濾波   opencv   影像處理   

對於圖形的平滑與濾波,但從濾波角度來講,一般主要的目的都是為了實現對映像雜訊的消除,增強映像的效果。
首先介紹二維卷積運算,映像的濾波可以看成是濾波模板與原始映像對應部分的的卷積運算。關於卷積運算,找到幾篇相關的部落格:

影像處理:基礎(模板、卷積運算)
影像處理-模板、卷積的整理

對於2D映像可以進行低通或者高通濾波操作,低通濾波(LPF)有利於去噪,模糊映像,高通濾波(HPF)有利於找到映像邊界。

(一)統一的2D濾波器cv2.filter2D

Opencv提供的一個通用的2D濾波函數為cv2.filter2D(),濾波函數的使用需要一個核模板,對映像的濾波操作過程為:將和模板放在映像的一個像素A上,求與之對應的映像上的每個像素點的和,核不同,得到的結果不同,而濾波的使用核心也是對於這個核模板的使用,需要注意的是,該濾波函數是單通道運算的,也就是說對於彩色映像的濾波,需要將彩色映像的各個通道提取出來,對各個通道分別濾波才行。
這裡說一個與matlab相似的情況,matlab中也有一個類似的濾波函數imfilter,對於濾波函數的應用其實不只在於濾波,對於許多映像的整體處理上,其實都可以用濾波函數來組合實現,得到更快的效果,相關的介紹間下面這個部落格:

映像濾波函數imfilter函數的應用及其擴充

import cv2import numpy as npimport matplotlib.pyplot as pltimg = cv2.imread(‘flower.jpg‘,0) #直接讀為灰階映像img1 = np.float32(img) #轉化數實值型別kernel = np.ones((5,5),np.float32)/25dst = cv2.filter2D(img1,-1,kernel)#cv2.filter2D(src,dst,kernel,auchor=(-1,-1))函數:#輸出映像與輸入映像大小相同#中間的數為-1,輸出數值格式的相同plt.figure()plt.subplot(1,2,1),plt.imshow(img1,‘gray‘)#預設彩色,另一種彩色bgrplt.subplot(1,2,2),plt.imshow(dst,‘gray‘)


下面介紹的幾種濾波部分可能是將函數cv2.filter2D()具體化,重新規定一個名字而已,貼一個好的部落格參考:

映像平滑處理(歸一化塊濾波、高斯濾波、中值濾波、雙邊濾波)

(二)均值濾波

上述產生的5*5核模板其實就是一個均值濾波。而opencv有一個專門的平均濾波模板供使用–歸一化卷積模板,所有的濾波模板都是使卷積框覆蓋地區所有像素點與模板相乘後得到的值作為中心像素的值。Opencv中均值模板可以用cv2.blur和cv2.boxFilter,比如一個3*3的模板其實就可以如下表示:
M=19???111111111???
模板大小是m*n是可以設定的。如果你不想要前面的1/9,可以使用非歸一化的模板cv2.boxFilter。一個執行個體如下:

import cv2import matplotlib.pyplot as pltimg = cv2.imread(‘flower.jpg‘,0) #直接讀為灰階映像blur = cv2.blur(img,(3,5))#模板大小3*5plt.subplot(1,2,1),plt.imshow(img,‘gray‘)#預設彩色,另一種彩色bgrplt.subplot(1,2,2),plt.imshow(blur,‘gray‘)

(三)高斯模糊模板

現在把卷積模板中的值換一下,不是全1了,換成一組符合高斯分布的數值放在模板裡面,比如這時中間的數值最大,往兩邊走越來越小,構造一個小的高斯包。實現的函數為cv2.GaussianBlur()。對於高斯模板,我們需要制定的是高斯核的高和寬(奇數),沿x與y方向的標準差(如果只給x,y=x,如果都給0,那麼函數會自己計算)。高斯核可以有效出去映像的高斯雜訊。當然也可以自己構造高斯核,相關函數:cv2.GaussianKernel().

import cv2import numpy as npimport matplotlib.pyplot as pltimg = cv2.imread(‘flower.jpg‘,0) #直接讀為灰階映像for i in range(2000): #添加點雜訊    temp_x = np.random.randint(0,img.shape[0])    temp_y = np.random.randint(0,img.shape[1])    img[temp_x][temp_y] = 255blur = cv2.GaussianBlur(img,(5,5),0)plt.subplot(1,2,1),plt.imshow(img,‘gray‘)#預設彩色,另一種彩色bgrplt.subplot(1,2,2),plt.imshow(blur,‘gray‘) 

(四)中值濾波模板

中值濾波模板就是用卷積框中像素的中值代替中心值,達到去雜訊的目的。這個模板一般用於去除椒鹽雜訊。前面的濾波器都是用計算得到的一個新值來取代中心像素的值,而中值濾波是用中心像素周圍(也可以使他本身)的值來取代他,卷積核的大小也是個奇數。

import cv2import numpy as npimport matplotlib.pyplot as pltimg = cv2.imread(‘flower.jpg‘,0) #直接讀為灰階映像for i in range(2000): #添加點雜訊    temp_x = np.random.randint(0,img.shape[0])    temp_y = np.random.randint(0,img.shape[1])    img[temp_x][temp_y] = 255blur = cv2.medianBlur(img,5)plt.subplot(1,2,1),plt.imshow(img,‘gray‘)#預設彩色,另一種彩色bgrplt.subplot(1,2,2),plt.imshow(blur,‘gray‘) 


可以看到中值濾波對於這些白點雜訊的去除是非常的好的。

(五)雙邊濾波

雙邊濾波函數為cv2.bilateralFilter()。該濾波器可以在保證邊界清晰的情況下有效去掉雜訊。它的構造比較複雜,即考慮了映像的空間關係,也考慮映像的灰階關係。雙邊濾波同時使用了空間高斯權重和灰階相似性高斯權重,確保了邊界不會被模糊掉。有一個介紹專門介紹雙邊濾波的部落格:

雙邊濾波器的原理及實現

cv2.bilateralFilter(img,d,’p1’,’p2’)函數有四個參數需要,d是領域的直徑,後面兩個參數是空間高斯函數標準差和灰階值相似性高斯函數標準差。一個執行個體如下:

import cv2import numpy as npimport matplotlib.pyplot as pltimg = cv2.imread(‘flower.jpg‘,0) #直接讀為灰階映像for i in range(2000): #添加點雜訊    temp_x = np.random.randint(0,img.shape[0])    temp_y = np.random.randint(0,img.shape[1])    img[temp_x][temp_y] = 255#9---濾波領域直徑#後面兩個數字:空間高斯函數標準差,灰階值相似性標準差blur = cv2.bilateralFilter(img,9,75,75)plt.subplot(1,2,1),plt.imshow(img,‘gray‘)#預設彩色,另一種彩色bgrplt.subplot(1,2,2),plt.imshow(blur,‘gray‘)

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

Python下opencv使用筆記(五)(映像的平滑與濾波)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.