OpenCV Python教程(5 初級濾波內容)

2022-04-11 13:40:48 字數 3162 閱讀 3638

本篇文章介紹如何用opencv-python來實現初級濾波功能。

本文介紹使用opencv-python實現基本的濾波處理

本文不介紹濾波處理的詳細概念,所以讀者需要預先對其有一定的了解。

過濾是訊號和影象處理中基本的任務。其目的是根據應用環境的不同,選擇性的提取影象中某些認為是重要的資訊。過濾可以移除影象中的噪音、提取感興趣的可視特徵、允許影象重取樣,等等。其源自於一般的訊號和系統理論,這裡將不介紹該理論的細節。但本章會介紹關於過濾的基本概念,以及如何在影象處理程式中使用濾波器。首先,簡要介紹下頻率域分析的概念。

當我們觀察一張時,我們觀察的是影象中有多少灰度級(或顏色)及其分布。根據灰度分布的不同來區分不同的影象。但還有其他方面可以對影象進行分析。我們可以觀察影象中灰度的變化。某些影象中包含大量的強度不變的區域(如藍天),而在其他影象中的灰度變化可能會非常快(如包含許多小物體的擁擠的影象)。因此,觀察影象中這些變化的頻率就構成了另一條分類影象的方法。這個觀點稱為頻域。而通過觀察影象灰度分布來分類影象稱為空間域。

頻域分析將影象分成從低頻到高頻的不同部分。低頻對應影象強度變化小的區域,而高頻是影象強度變化非常大的區域。目前已存在若干轉換方法,如傅利葉變換或余弦變換,可以用來清晰的顯示影象的頻率內容。注意,由於影象是乙個二維實體,所以其由水平頻率(水平方向的變化)和豎直頻率(豎直方向的變化)共同組成。

在頻率分析領域的框架中,濾波器是乙個用來增強影象中某個波段或頻率並阻塞(或降低)其他頻率波段的操作。低通濾波器是消除影象中高頻部分,但保留低頻部分。高通濾波器消除低頻部分

本篇文章使用傳統的lena作為實驗影象。

低通濾波器的目標是降低影象的變化率。如將每個畫素替換為該畫素周圍畫素的均值。這樣就可以平滑並替代那些強度變化明顯的區域。在opencv中,可以通過blur函式做到這一點:

dst = cv2.blur(image,(5,5));
其中dst是blur處理後返回的影象,引數一是輸入的待處理影象,引數2是低通濾波器的大小。其後含有幾個可選引數,用來設定濾波器的細節,具體可查閱參考資料2。不過這裡,這樣就夠了。下面是乙個簡單的示例**:

結果如下,左邊是平滑過的影象,右邊是原影象:

這種濾波器又稱為boxfilter(注,這與化學上的箱式過濾器是兩碼事,所以這裡就不翻譯了)。所以也可通過opencv的cv2.bofxfilter(...)函式來完成相同的工作。如下:

result1 = cv2.boxfilter(img, -1, (5, 5))
這行**與上面使用blur函式的效果完全相同。其中第二個引數的-1表示輸出影象使用的深度與輸入影象相同。後面還有幾個可選引數,具體可查閱opencv文件。

在某些情況下,需要對乙個畫素的周圍的畫素給予更多的重視。因此,可通過分配權重來重新計算這些周圍點的值。這可通過高斯函式(鐘形函式,即喇叭形數)的權重方案來解決。cv::gaussianblur函式可作為濾波器用下面的方法呼叫:

gaussianresult = cv2.gaussianblur(img,(5,5),1.5)
低通濾波與高斯濾波的不同之處在於:低通濾波中,濾波器中每個畫素的權重是相同的,即濾波器是線性的。而高斯濾波器中畫素的權重與其距中心畫素的距離成比例。關於高斯模糊的詳細內容,抽空將寫一篇獨立的文章介紹。

前面介紹的是線性過濾器,這裡介紹非線性過濾器——中值濾波器。由於中值濾波器對消除椒鹽現象特別有用。所以我們使用第二篇教程中椒鹽函式先對影象進行處理,將處理結果作為示例。

呼叫中值濾波器的方法與呼叫其他濾波器的方法類似,如下:

result = cv2.medianblur(image,5)
函式返回處理結果,第乙個引數是待處理影象,第二個引數是孔徑的尺寸,乙個大於1的奇數。比如這裡是5,中值濾波器就會使用5×5的範圍來計算。即對畫素的中心值及其5×5鄰域組成了乙個數值集,對其進行處理計算,當前畫素被其中值替換掉。

如果在某個畫素周圍有白色或黑色的畫素,這些白色或黑色的畫素不會選擇作為中值(最大或最小值不用),而是被替換為鄰域值。**如下:

處理結果如下:

由於中值濾波不會處理最大和最小值,所以就不會受到雜訊的影響。相反,如果直接採用blur進行均值濾波,則不會區分這些雜訊點,濾波後的影象會受到雜訊的影響。

中值濾波器在處理邊緣也有優勢。但中值濾波器會清除掉某些區域的紋理(如背景中的樹)。

由於方向濾波器與這裡的原理有較大的出入,所以將用獨立的一篇文章中介紹其原理以及實現。

OpenCV Python入門教程5 閾值分割

灰度圖讀入 閾值分割 ret,th cv2.threshold img,127,255,cv2.thresh binary cv2.imshow thresh th cv2.waitkey 0 cv2.threshold 用來實現閾值分割,有4個引數 理解這5種閾值方式 應用5種不同的閾值方法 re...

OpenCV python基礎教程

在傳統的計算機視覺處理中,opencv依然是最為基礎和常用的工具。即便是如今深度學習如火如荼,在影象處理領域表現出越來越強大的潛力時,opencv也不失為預處理的有效手段。另外,opencv的工具箱裡,也不斷再融入機器學習的演算法,充實自身才能應對變化。說明一下,我一向不習慣做教程,覺得浪費時間,東...

翻譯 OpenCV Python教程 形態變化

這個系列是自己瞎翻的,文法很醜,主要靠意會,跳著跳著撿重要的部分翻,翻錯了不負責,就這樣哈。基於3.4.3,morphological transformations,附原文。在這一章節,形態變換是基於影象形狀的一些簡單操作。它通常在二進位制影象上執行。它需要兩個輸入,乙個是我們的原始影象,第二個是...