學習opencv3 閱讀第十章

2021-09-22 20:00:06 字數 2685 閱讀 4688

導數和梯度

影象形態學

cv::adaptivethreshold()

當影象**現較大的明暗差異時,自適應閾值是非常有效的。這個函式進處理單通道8位或浮點型影象,並且要求源影象和目標影象不同。

在一些應用中也稱為「模糊」,是一種簡單而又常用的影象處理操作。

目的:通常是為了減少雜訊和偽影。

在降低影象解析度的時候,平滑也是十分重要的。

cv::blur()實現了簡單模糊,目標影象中的每乙個值都是源影象中相應位置乙個視窗(核)中畫素的平均值。

方框型濾波器是一種矩形的並且濾波器中所有值ki,j全部相等的濾波器。通常ki,j為1或者1/a,其中a是濾波器的面積。後一種濾波器稱為「歸一化方框型濾波器」

cv::medianblur()預設核的中心點為錨點。

將每個畫素替換為圍繞這個畫素的矩形鄰域內的中值或「中值」畫素(相對於平均畫素)。

通過平均的簡單模糊對雜訊影象,尤其是有較大孤立的異常值(比如數字影像中的拍攝雜訊)非常敏感。少量具有較大偏差的點也會嚴重影響到均值濾波。中值濾波可以採用取中間點的方式來消除異常值。

中值濾波是一種非線性核的例項。

cv::gaussianblur

最有用的一種濾波器。高斯濾波對輸入陣列進行以此規範化的高斯核濾波,然後輸出目標陣列。

opencv實現的高斯平滑還為幾個常用的核心提供效能上的優化。33、55以及7*7的標準sigma核(sigmax=0.0)相對其他核效能更優。高斯模糊支援單通道/三通道的8位/32位浮點型影象等。

cv::bilateralfilter

雙邊濾波器是一種比較大的影象分析運算元,也就是邊緣保持平滑。相對於高斯平滑,雙邊平滑更容易理解。高斯模糊的過程是減緩畫素在空間上的變化,因此與鄰域的關係緊密,而隨雜訊在畫素間的變化幅度又會非常的大(即雜訊不是空間相關的)。基於這種前提高斯平滑很好的減弱了雜訊並且保留了小訊號。不幸的是,這種方式破壞了邊緣資訊,最終結果是高斯模糊把邊緣也模糊了。相似於高斯模糊,雙邊濾波對每個畫素及其領域內的畫素進行了加權平均。其權重由兩部分組成,第一部分同高斯平滑;第二部分也是高斯權重,不同的是它不是基於空間距離而是色彩強度差計算而來,在多通道(彩色)影象上強度差由各分量的加權累加代替。可以把雙邊濾波當作是高斯平滑,只是相似程度更高的畫素權值更高,邊緣更明顯,對比度更高。雙邊濾波的效果就是將原影象變成一副水彩畫,這種效果在多次迭代後更加顯著,因此這種方法在影象分割領域十分有用。

除源影象和目標影象外,雙邊濾波器還需要提供三個引數,

第乙個是畫素領域的直徑d;

第二個是顏色空間濾波器的sigma值sigmacolor,其與高斯濾波器中的引數sigma相似;

第三個是座標空間中濾波器的sigma值sigmaspace。第二個引數越大,平滑時所包括的強度(色彩)越大(因此影象的不連續性將會更顯著)。

實際情況中,小的sigmaspace值比如10會帶來乙個輕微的但也明顯的效果;而大的sigmaspace比值比如150會對影象產生非常顯著的影響,使影象有一種**的效果。

卷積中最重要也是最基礎的部分就是(近似)計算導數。

用來表示微分的最常用的運算元是索貝爾(sobel)導數運算元。sobel運算元可以實現任意階導數和混合偏導數。

cv::sobel()

sobel運算元有乙個好處就是可以將核定義為各種大小,並且可以快速、迭代式地構造這些核。大的核可以更好地近似導數,因為可以消除雜訊影響。不過,假如導數在空間上變化劇烈,核太大會使結果發生偏差。

sobel運算元不是真正的導數,因為它定義在離散空間上。sobel運算元實際上表示的是乙個多項式,也就是說在x方向上進行二階sobel運算表示的並不是二階導數,而是對拋物線函式的區域性擬合。這也就說明了為什麼要使用乙個更大的核,更大的核擬合了更多的畫素。

scharr濾波器

在離散空間上有很多方法來近似導數,sobel運算元的缺點是核比較小的時候準確度不高。對於大型的核,近似過程中使用了較多的點,因此精度問題不太顯著。cv::sobel()中使用的x、y濾波器不會出現這種偏差(在x方向或y方向),因為它們準確地與x、y軸對齊。當你需要計算某一點地梯度時,問題就來了(影象梯度的方向通過計算兩個濾波器響應比值y/x的反正切值得來)。

為了將影象內的資訊聯絡起來,你可能需要這樣測量一幅影象:在處理過程中,通過在目標附近組織一副梯度直方圖來收集其形狀資訊,這些直方圖是許多形狀分類器訓練和使用的基礎。因此,梯度角的誤差會降低分類器識別的效果。

對於33的sobel濾波器,梯度角距離水平或垂直方向越遠,誤差越明顯。在opencv中,呼叫cv::sobel()時設定kisecv::scharr,即可消除33這樣小但是快的sobel導數濾波器所帶來的誤差。scharr濾波器和sobel濾波器同樣很快,但是前者精度更高。因此選擇3*3的濾波器時,應當使用scharr濾波器。

拉普拉斯變換

opencv中的函式laplacian實現了對拉普拉斯運算元的離散近似。

由於laplacian運算元可以通過二階導數定義,因此可以把它的離散實現與二階sobel導數聯絡起來。實際上,opencv在實現laplacian運算元時使用了sobel運算元。

laplacian運算元可以用於各種場景處理,

一種常見的應用就是匹配「斑點」。

同樣可用於邊緣檢測。

第十章 函式

使用def關鍵字 定義個數可變的位置形參 定義個數可變的關鍵字形參 定義預設值引數 定義個數可變的位置形參 deffun1 args 結果為乙個元組 print args fun1 10,20,30 10,20,30 定義個數可變的關鍵字形參 deffun2 args 結果為乙個字典 print a...

第十章 屬性

z屬性 本章也比較簡單稍作介紹 無參屬性就是我們常見的屬性 可以封裝屬性 以執行緒安全方式訪問 有參屬性就是c 中的所引器 匿名型別 如圖遇到如下 具體點就是 上面的注釋也已經講清楚了,定義的型別之後,構造例項,然後初始化屬性。現在詳細說下 編譯器接收到 上圖 先用var 定義乙個型別,但是不具體指...

第十章 屬性

目錄 10.1 無參屬性 10.2 有參屬性 10.3 呼叫屬性訪問器方法時的效能 10.4 屬性訪問器的可訪問性 10.5 泛型屬性訪問器方法 物件導向設計和程式設計的重要原則之一就是資料封裝,意味著型別的字段不應該公開,否則很容易因為不恰單使用欄位而破壞物件的狀態。可將屬性想象成智慧型字段,即背...