Ⅰ 使用OpenCV和python進行圖像拼接
么是圖像拼接呢?簡單來說,對於輸入應該有一組圖像,輸出是合成圖像。同時,必須保留圖像之間的邏輯流。
首先讓我們了解圖像拼接的概念。基本上,如果你想捕捉一個大的場景,你的相機只能提供一個特定解析度的圖像(如:640×480),這當然不足以捕捉大的全景。所以,我們可以做的是捕捉整個場景的多個圖像,然後把所有的碎片放在一起,形成一個大的圖像。這些有序的照片被稱為全景。獲取多幅圖像並將其轉換成全景圖的整個過程稱為圖像拼接。
首先,需要安裝opencv 3.4.2.16。
接下來我們將導入我們將在Python代碼中使用的庫:
在我們的教程中,我們將拍攝這張精美的照片,我們會將其分成兩張左右兩張照片,然後我們會嘗試拍攝相同或非常相似的照片。
因此,我將此圖像切成兩個圖像,它們會有某種重疊區域:
在此,我們將列出我們應採取的步驟,以取得最終的結果:
因此,從第一步開始,我們將導入這兩個圖像並將它們轉換為灰度,如果您使用的是大圖像,我建議您使用cv2.resize,因為如果您使用較舊的計算機,它可能會非常慢並且需要很長時間。如果要調整圖像大小,即調整50%,只需將fx = 1更改為fx = 0.5即可。
我們還需要找出兩幅圖像中匹配的特徵。我們將使用opencv_contrib的SIFT描述符。SIFT (Scale constant Feature Transform)是一種非常強大的OpenCV演算法。這些最匹配的特徵作為拼接的基礎。我們提取兩幅圖像的關鍵點和sift描述符如下:
kp1和kp2是關鍵點,des1和des2是圖像的描述符。如果我們用特徵來畫這幅圖,它會是這樣的:
左邊的圖像顯示實際圖像。右側的圖像使用SIFT檢測到的特徵進行注釋:
一旦你有了兩個圖像的描述符和關鍵點,我們就會發現它們之間的對應關系。我們為什麼要這么做?為了將任意兩個圖像連接成一個更大的圖像,我們必須找到重疊的點。這些重疊的點會讓我們根據第一幅圖像了解第二幅圖像的方向。根據這些公共點,我們就能知道第二幅圖像是大是小還是旋轉後重疊,或者縮小/放大後再fitted。所有此類信息的產生是通過建立對應關系來實現的。這個過程稱為registration。
對於匹配圖像,可以使用opencv提供的FLANN或BFMatcher方法。我會寫兩個例子證明我們會得到相同的結果。兩個示例都匹配兩張照片中更相似的特徵。當我們設置參數k = 2時,這樣我們就要求knnMatcher為每個描述符給出2個最佳匹配。「matches」是列表的列表,其中每個子列表由「k」個對象組成。以下是Python代碼:
FLANN匹配代碼:
BFMatcher匹配代碼:
通常在圖像中,圖像的許多地方可能存在許多特徵。所以我們過濾掉所有的匹配來得到最好的。因此我們使用上面得到的前2個匹配項進行比值檢驗。如果下面定義的比值大於指定的比值,則考慮匹配。
現在我們定義在圖像上繪制線條的參數,並給出輸出以查看當我們在圖像上找到所有匹配時的樣子:
這是輸出的匹配圖像:
這部分完整Python代碼:
因此,一旦我們獲得了圖像之間的最佳匹配,我們的下一步就是計算單應矩陣。如前所述,單應矩陣將與最佳匹配點一起使用,以估計兩個圖像內的相對方向變換。
在OpenCV中估計單應性是一項簡單的任務,只需一行代碼:
在開始編碼拼接演算法之前,我們需要交換圖像輸入。所以img_現在會取右圖像img會取左圖像。
那麼讓我們進入拼接編碼:
因此,首先,我們將最小匹配條件count設置為10(由MIN_MATCH_COUNT定義),並且只有在匹配良好的匹配超出所需匹配時才進行拼接。否則,只需顯示一條消息,說明匹配不夠。
因此,在if語句中,我們將關鍵點(從匹配列表)轉換為findHomography()函數的參數。
只需在這段代碼中討論cv2.imshow(「original_image_overlapping.jpg」,img2),我們就會顯示我們收到的圖像重疊區域:
因此,一旦我們建立了單應性,我們需要扭曲視角,我們將以下單應矩陣應用於圖像:
所以我們使用如下:
在上面兩行Python代碼中,我們從兩個給定的圖像中獲取重疊區域。然後在「dst」中我們只接收到沒有重疊的圖像的右側,因此在第二行代碼中我們將左側圖像放置到最終圖像。所以在這一點上我們完全拼接了圖像:
剩下的就是去除圖像的黑色,所以我們將編寫以下代碼來從所有圖像邊框中刪除黑邊:
這是我們調用修剪邊界的最終定義函數,同時我們在屏幕上顯示該圖像。如果您願意,也可以將其寫入磁碟:
使用上面的Python代碼,我們將首先收到原始圖片:
這是完整的最終代碼:
在本教程中,我們學習了如何使用OpenCV執行圖像拼接和全景構造,並編寫了最終的圖像拼接代碼。
我們的圖像拼接演算法需要四個主要步驟:檢測關鍵點和提取局部不變描述符; 獲得圖像之間的匹配描述符; 應用RANSAC估計單應矩陣; 使用單應矩陣應用warping transformation。
當僅為兩個圖像構建全景圖時,該演算法在實踐中工作良好。
Ⅱ OpenCV-Python教程:19.輪廓屬性
1圖像矩
幫你計算一些屬性,比如重心,面積等。
函數cv2.moments()會給你一個字典,包含所有矩值
你可以從這個裡面得到有用的數據比如面積,重心等。重心可以用下面的式子得到:
2.輪廓面積
輪廓面積由函數cv2.contourArea()得到或者從矩里得到M['m00']
3.輪廓周長
可以用cv2.arcLength()函數得到。第二個參數指定形狀是否是閉合的輪廓(如果傳True)。或者只是一個曲線。
4.輪廓近似
這會把輪廓形狀近似成別的邊數少的形狀,邊數由我們指定的精確度決定。這是Douglas-Peucker演算法的實現。
要理解這個,假設你試圖找一個圖像里的方塊,但是由於圖像里的一些問題,你得不到一個完美的方塊,只能得到一個「壞方塊」。現在你可以使用這個函數來近似,第二個參數叫epsilon,是從輪廓到近似輪廓的最大距離。是一個准確率參數,好的epsilon的選擇可以得到正確的輸出。
在下面第二個圖像里,綠線顯示了epsilon = 10% of arc length 的近似曲線。第三個圖像顯示了epsilon = 1% of the arc length。第三個參數指定曲線是否閉合。
5.凸形外殼
凸形外殼和輪廓近似類似,但是還不一樣(某些情況下兩個甚至提供了同樣的結果)。這兒,cv2.convexHull()函數檢查凸面曲線缺陷並修復它。一般來說,凸面曲線總是外凸的,至少是平的,如果它內凹了,這就叫凸面缺陷。比如下面這張圖,紅線顯示了手的凸形外殼。雙向箭頭顯示了凸面缺陷,是輪廓外殼的最大偏差。
參數詳情:
·points 是我們傳入的輪廓
·hull 是輸出,一般我們不用傳
·clockwise: 方向標示,如果是True,輸出凸形外殼是順時針方向的。否則,是逆時針的。
·returnPoints:默認是True。然後會返回外殼的點的坐標。如果為False,它會返回輪廓對應外殼點的索引。
所以要獲得凸形外殼,下面
但是如果你想找到凸面缺陷,你需要傳入returnPoints = False。我們拿上面的矩形圖形來說,首先我找到他的輪廓cnt,現在用returnPoints = True來找他的凸形外殼,我得到下面的值:[[[234 202]], [[51 202]], [51 79]], [[234 79]]] 是四個角的點。如果你用returnPoints = False,我會得到下面的結果:[[129], [67], [0], [142]]. 這是輪廓里對應點的索引,比如cnt[129] = [234, 202]],這和前面結果一樣。
6.檢查凸面
有一個函數用來檢查是否曲線是凸面, cv2.isContourConvex().它返回True或False。
7.邊界矩形
有兩種邊界矩形
7.a.正邊界矩形
這個矩形不考慮對象的旋轉,所以邊界矩形的面積不是最小的,函數是cv2.boundingRect()。
假設矩形左上角的坐標是(x,y), (w, h)是它的寬和高
7.b.渲染矩形
這個邊界矩形是用最小面積畫出來的,所以要考慮旋轉。函數是cv2.minAreaRect()。它返回一個Box2D結構,包含了(左上角(x,y),(width, height),旋轉角度)。但是要畫這個矩形我們需要4個角。這四個角用函數cv2.boxPoints()得到
8.最小閉包圓
我們找一個目標的外接圓可以用函數cv2.minEnclosingCircle().這個圓用最小面積完全包圍目標。
9.橢圓
用一個橢圓來匹配目標。它返回一個旋轉了的矩形的內接橢圓
10. 直線
類似的我們可以匹配一根直線,下面的圖像包含一系列的白色點,我們可以給它一條近似的直線。
END
Ⅲ 如何在Python中使用OpenCV的
0.下載安裝Opencv,當前版本為249.
1.下載Python,當前OPencv版本為249,不過其支持的最新版本的Python為2.7,所以可以下載276版本。
2.下載numpy,開始我使用了1.6,沒有通過,錯誤如圖。下載了最新的1.8.1版本。
3.將Opencv安裝目錄下opencv\build\python\2.7\x86中的cv2.pyd復制到python安裝目錄Lib\site-packages下。
4.找到opencv源文件內的draw.py運行。
~如果你認可我的回答,請及時點擊【採納為滿意回答】按鈕
~~手機提問的朋友在客戶端右上角評價點【滿意】即可。
~你的採納是我前進的動力
~~O(∩_∩)O,記得好評和採納,互相幫助,謝謝。
Ⅳ 如何在Python中使用OpenCV的
0.下載安裝Opencv,當前版本為249.
1.下載Python,當前OPencv版本為249,不過其支持的最新版本的Python為2.7,所以可以下載276版本。
2.下載numpy,開始我使用了1.6,沒有通過,錯誤如圖。下載了最新的1.8.1版本。
3.將Opencv安裝目錄下opencvuildpython2.7x86中的cv2.pyd復制到python安裝目錄Libsite-packages下。
4.找到opencv源文件內的draw.py運行。
~如果你認可我的回答,請及時點擊【採納為滿意回答】按鈕
~~手機提問的朋友在客戶端右上角評價點【滿意】即可。
~你的採納是我前進的動力
~~O(∩_∩)O,記得好評和採納,互相幫助,謝謝。
Ⅳ Python如何實現圖片特徵點匹配
python-opencv-特徵點匹配連線(畫線)drawMatches
Python 沒有OpenCV 2.4.13版本的cv2.drawMatches(),無法直接使用,故可參看本文第2節的drawMatches函數使用
Python 有OpenCV 3.0.0版本的cv2.drawMatches(),可以直接使用
1、drawMatches數據結構(opencv2.4.13)
Draws the found matches of keypoints from two images.
C++:
Parameters:
img1– First source image.
keypoints1– Keypoints from the first source image.
img2– Second source image.
keypoints2– Keypoints from the second source image.
matches1to2– Matches from the first image to the second one, which means that keypoints1[i] has a corresponding point in keypoints2[matches[i]] .
outImg – Output image. Its content depends on the flags value defining what is drawn in the output image. See possible flags bit values below.
matchColor– Color of matches (lines and connected keypoints). If matchColor==Scalar::all(-1) , the color is generated randomly.
singlePointColor – Color of single keypoints (circles), which means that keypoints do not have the matches. If singlePointColor==Scalar::all(-1) , the color is generated randomly.
matchesMask– Mask determining which matches are drawn. If the mask is empty, all matches are drawn.
flags– Flags setting drawing features. Possible flags bit values are defined by DrawMatchesFlags.
This function draws matches of keypoints from two images in the output image. Match is a line connecting two keypoints (circles). The structure DrawMatchesFlags is defined as follows:
2、drawMatches(python實現)
Ⅵ OpenCV-Python教程:22.輪廓層級
理論
在前面的關於輪廓的幾節里,我們介紹了輪廓相關的一些函數。但當我們用cv2.findContours()函數來找輪廓的時候,我們傳入了一個參數,Contour Retrieval Mode。我們一般傳的是cv2.RETR_LIST或者cv2.RETR_TREE這樣就可以了。但是這個參數實際是什麼意思呢?
並且在輸出時我們得到了三個數組,第一個是圖像,第二個是我們的輪廓,第三個輸出名字是hierarchy。但是我們一直沒用這個。
什麼是層級?
一般來說我們用cv2.findContours()函數來檢測圖像里的目標,有時候目標在不同的地方,但是在有些情況下,有些圖形在別的圖形裡面,就像圖形嵌套,在這種情況下,我們把外面那層圖形叫做parent,裡面的叫child。這樣圖形里的輪廓之間就有了關系。我們可以指定一個輪廓和其他之間的是如何連接的,這種關系就是層級。
看下面的例子:
在這個圖像里,不同的圖形我標注了0-5,2和2a表示了最外層盒子的外部和內部輪廓。
這里輪廓0,1,2是外部的。我們可以說他們是hierarchy-0,或者他們是同層級的。
接下來是contour-2a,可以認為是輪廓-2的孩子,或者反過來,contour-2是contour-2a的父親,所以它在hierarchy-1里。類似的contour-3是contour-2的孩子,在下一層級。最後contour4,5是contour-3a的孩子,它們在最後的層級。
OpenCV里的層級表示
每個輪廓有他自己的關於層級的信息,誰是他的孩子,誰是他的父親等。OpenCV用一個包含四個值得數組來表示:[Next, Previous, First_Child, Parent]
"Next表明同一層級的下一個輪廓"
比如,在我們的圖片里的contour-0,水上hi他相同層級的下一個輪廓?是contour-1,所以Next=1,對於Contour-1,下一個是contour-2,所以Next=2
那對於contour-2呢?沒有同層級的下一個輪廓,所以Next=-1。那麼對於contour-4呢?同層級的下一個是contour-5,所以下一個輪廓是contour-5.Next=5
"Previous指同層級的前一個輪廓"
和上面一樣,contour-1的前一個是contour-0.contour-2的前一個contour-1.對於contour-0沒有前序,所以-1
"First_Child指它的第一個孩子輪廓"
不用解釋,對於contour-2,孩子是contour-2a,所以這里是contour-2a的索引,contour-3a有兩個孩子,但我們只取第一個,是contour-4,所以First_Child=4.
"Parent指它的父輪廓索引"
和First_Child相反,contour-4和contour-5的parent都是contour-3a,對於contour-3a,是contour-3
注意:
如果沒有孩子或者父親,就為-1
我們知道了層級,現在來看OpenCV里的輪廓獲取模式,四個標志cv2.RETR_LIST, cv2.RETR_TREE, cv2.RETR_CCOMP, cv2.RETR_EXTERNAL表示啥?
輪廓獲取模式
1.RETR_LIST
這是最簡單的一個,它獲取所有輪廓,但是不建立父子關系,他們都是一個層級。
所以,層級屬性第三個和第四個欄位(父子)都是-1,但是Next和Previous還是有對應值。
下面是結果,每行是對應輪廓的層級信息。
>>> hierarchy
2.RETR_EXTERNAL
如果用這個模式,它返回最外層的。所有孩子輪廓都不要,我們可以說在這種情況下,只有家族裡最老的會被照顧,其他都不管。
所以在我們的圖像里,有多少最外層的輪廓呢,有3個,contours 0,1,2
3.RETR_CCOMP
這個模式獲取所有輪廓並且把他們組織到一個2層結構里,對象的輪廓外邊界在等級1里,輪廓內沿(如果有的話)放在層級2里。如果別的對象在它裡面,裡面的對象輪廓還是放在層級1里,它的內沿在層級2.
看下面的例子,輪廓的順序為紅色,他們的層級是綠色,
看第一個輪廓,contour-0,他的層級是1,他有兩個洞,contours1和2,他們都屬於層級2,所以對於contour-0,Next是contour-3,沒有前序,他的第一個孩子是contour-1,沒有parent,所以層級數組是[3,-1,1,-1]
看contour-1,他在層級2里,Next是contour-2,沒有前序,沒有孩子,parent是contour-0,所以數組是[2,-1,-1,0]
同樣對於contour-2,也在層級2里,沒有next,前序是contour-1,沒有孩子,parent是contour-0,所以[-1,1,-1,0]。
contour-3:next是contour-5,Previous是contour-0,Child是contour-4,沒有parent,所以[5,0,4,-1]
contour-4:在層級2里,沒有兄弟,所以沒有Next,沒有Previous,沒有孩子,parent是contour-3,[-1,-1,-1,3]
4.RETR_TREE
最後,Mr.Perfect。它取回所有的輪廓並且創建完整的家族層級列表,它甚至能告訴你誰是祖父,父親,兒子,孫子。。
比如把上面的圖形用cv2.RETR_TREE,
對於contour-0:層級是0,Next是contour-7,沒有previous,孩子是contour-1,沒有parent,所以[7,-1,1,-1]
contour-1:在層級1里,沒有同級的其他輪廓,沒有previous,孩子是contour-2,所以[-1,-1,2,0]
OpenCV里的直方圖
Ⅶ OpenCV Python 系列教程4 - OpenCV 圖像處理(上)
學習目標:
OpenCV 中有 150 多種色彩空間轉化的方法,這里只討論兩種:
HSV的色相范圍為[0,179],飽和度范圍為[0,255],值范圍為[0,255]。不同的軟體使用不同的規模。如果要比較 OpenCV 值和它們,你需要標准化這些范圍。
HSV 和 HLV 解釋
運行結果:該段程序的作用是檢測藍色目標,同理可以檢測其他顏色的目標
結果中存在一定的噪音,之後的章節將會去掉它
這是物體跟蹤中最簡單的方法。一旦你學會了等高線的函數,你可以做很多事情,比如找到這個物體的質心,用它來跟蹤這個物體,僅僅通過在相機前移動你的手來畫圖表,還有很多其他有趣的事情。
菜鳥教程 在線 HSV-> BGR 轉換
比如要找出綠色的 HSV 值,可以使用上面的程序,得到的值取一個上下界。如上面的取下界 [H-10, 100, 100],上界 [H+10, 255, 255]
或者使用其他工具如 GIMP
學習目標:
對圖像進行閾值處理,算是一種最簡單的圖像分割方法,基於圖像與背景之間的灰度差異,此項分割是基於像素級的分割
threshold(src, thresh, maxval, type[, dst]) -> retval, dst
計算圖像小區域的閾值。所以我們對同一幅圖像的不同區域得到不同的閾值,這給我們在不同光照下的圖像提供了更好的結果。
三個特殊的輸入參數和一個輸出參數
adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) -> dst
opencv-threshold-python
OpenCV 圖片集
本節原文
學習目標:
OpenCV 提供兩種變換函數: cv2.warpAffine 和 cv2.warpPerspective
cv2.resize() 完成縮放
文檔說明
運行結果
說明 : cv2.INTER_LINEAR 方法比 cv2.INTER_CUBIC 還慢,好像與官方文檔說的不一致? 有待驗證。
速度比較: INTER_CUBIC > INTER_NEAREST > INTER_LINEAR > INTER_AREA > INTER_LANCZOS4
改變圖像的位置,創建一個 np.float32 類型的變換矩陣,
warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) -> dst
運行結果:
旋轉角度( )是通過一個變換矩陣變換的:
OpenCV 提供的是可調旋轉中心的縮放旋轉,這樣你可以在任何你喜歡的位置旋轉。修正後的變換矩陣為
這里
OpenCV 提供了 cv2.getRotationMatrix2D 控制
cv2.getRotationMatrix2D(center, angle, scale) → retval
運行結果
cv2.getAffineTransform(src, dst) → retval
函數關系:
egin{bmatrix} x'_i y'_i end{bmatrix}egin{bmatrix} x'_i y'_i end{bmatrix} =
其中
運行結果:圖上的點便於觀察,兩圖中的紅點是相互對應的
透視變換需要一個 3x3 變換矩陣。轉換之後直線仍然保持筆直,要找到這個變換矩陣,需要輸入圖像上的 4 個點和輸出圖像上的對應點。在這 4 個點中,有 3 個不應該共線。通過 cv2.getPerspectiveTransform 計算得到變換矩陣,得到的矩陣 cv2.warpPerspective 變換得到最終結果。
本節原文
平滑處理(smoothing)也稱模糊處理(bluring),是一種簡單且使用頻率很高的圖像處理方法。平滑處理的用途:常見是用來 減少圖像上的噪點或失真 。在涉及到降低圖像解析度時,平滑處理是很好用的方法。
圖像濾波:盡量保留圖像細節特徵的條件下對目標圖像的雜訊進行抑制,其處理效果的好壞將直接影響到後續圖像處理和分析的有效性和可靠性。
消除圖像中的雜訊成分叫做圖像的平滑化或濾波操作。信號或圖像的能量大部分集中在幅度譜的低頻和中頻段,在高頻段,有用的信息會被雜訊淹沒。因此一個能降低高頻成分幅度的濾波器就能夠減弱雜訊的影響。
濾波的目的:抽出對象的特徵作為圖像識別的特徵模式;為適應圖像處理的要求,消除圖像數字化時混入的雜訊。
濾波處理的要求:不能損壞圖像的輪廓及邊緣等重要信息;圖像清晰視覺效果好。
平滑濾波是低頻增強的空間濾波技術,目的:模糊和消除噪音。
空間域的平滑濾波一般採用簡單平均法,即求鄰近像元點的平均亮度值。鄰域的大小與平滑的效果直接相關,鄰域越大平滑效果越好,但是鄰域過大,平滑也會使邊緣信息的損失的越大,從而使輸出圖像變得模糊。因此需要選擇合適的鄰域。
濾波器:一個包含加權系數的窗口,利用濾波器平滑處理圖像時,把這個窗口放在圖像上,透過這個窗口來看我們得到的圖像。
線性濾波器:用於剔除輸入信號中不想要的頻率或者從許多頻率中選擇一個想要的頻率。
低通濾波器、高通濾波器、帶通濾波器、帶阻濾波器、全通濾波器、陷波濾波器
boxFilter(src, ddepth, ksize[, dst[, anchor[, normalize[, borderType]]]]) -> dst
均值濾波是方框濾波歸一化後的特殊情況。歸一化就是要把處理的量縮放到一個范圍內如 (0,1),以便統一處理和直觀量化。非歸一化的方框濾波用於計算每個像素鄰近內的積分特性,比如密集光流演算法中用到的圖像倒數的協方差矩陣。
運行結果:
均值濾波是典型的線性濾波演算法,主要方法為鄰域平均法,即用一片圖像區域的各個像素的均值來代替原圖像中的各個像素值。一般需要在圖像上對目標像素給出一個模板(內核),該模板包括了其周圍的臨近像素(比如以目標像素為中心的周圍8(3x3-1)個像素,構成一個濾波模板,即 去掉目標像素本身 )。再用模板中的全體像素的平均值來代替原來像素值。即對待處理的當前像素點(x,y),選擇一個模板,該模板由其近鄰的若干像素組成,求模板中所有像素的均值,再把該均值賦予當前像素點(x,y),作為處理後圖像在該點上的灰度個g(x,y),即個g(x,y)=1/m ∑f(x,y) ,其中m為該模板中包含當前像素在內的像素總個數。
均值濾波本身存在著固有的缺陷,即它不能很好地保護圖像細節,在圖像去噪的同時也破壞了圖像的細節部分,從而使圖像變得模糊,不能很好地去除雜訊點。
cv2.blur(src, ksize[, dst[, anchor[, borderType]]]) → dst
結果:
高斯濾波:線性濾波,可以消除高斯雜訊,廣泛應用於圖像處理的減噪過程。高斯濾波就是對整幅圖像進行加權平均的過程,每一個像素點的值,都由其本身和鄰域內的其他像素值經過 加權平均 後得到。高斯濾波的具體操作是:用一個模板(或稱卷積、掩模)掃描圖像中的每一個像素,用模板確定的鄰域內像素的加權平均灰度值去替代模板中心像素點的值。
高斯濾波有用但是效率不高。
高斯模糊技術生成的圖像,其視覺效果就像是經過一個半透明屏幕在觀察圖像,這與鏡頭焦外成像效果散景以及普通照明陰影中的效果都明顯不同。高斯平滑也用於計算機視覺演算法中的預先處理階段,以增強圖像在不同比例大小下的圖像效果(參見尺度空間表示以及尺度空間實現)。從數學的角度來看,圖像的高斯模糊過程就是圖像與正態分布做卷積。由於正態分布又叫作高斯分布,所以這項技術就叫作高斯模糊。
高斯濾波器是一類根據高斯函數的形狀來選擇權值的線性平滑濾波器。 高斯平滑濾波器對於抑制服從正態分布的雜訊非常有效。
一維零均值高斯函數為: 高斯分布參數 決定了高斯函數的寬度。
高斯雜訊的產生
GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]]) -> dst
線性濾波容易構造,並且易於從頻率響應的角度來進行分析。
許多情況,使用近鄰像素的非線性濾波會得到更好的結果。比如在雜訊是散粒雜訊而不是高斯雜訊,即圖像偶爾會出現很大值的時候,用高斯濾波器進行圖像模糊時,雜訊像素不會被消除,而是轉化為更為柔和但仍然可見的散粒。
中值濾波(Median filter)是一種典型的非線性濾波技術,基本思想是用像素點鄰域灰度值的中值來代替該像素點的灰度值,該方法在去除脈沖雜訊、椒鹽雜訊『椒鹽雜訊又稱脈沖雜訊,它隨機改變一些像素值,是由圖像感測器,傳輸信道,解碼處理等產生的黑白相間的亮暗點雜訊。椒鹽雜訊往往由圖像切割引起。』的同時又能保留圖像邊緣細節,
中值濾波是基於排序統計理論的一種能有效抑制雜訊的非線性信號處理技術,其基本原理是把數字圖像或數字序列中一點的值用該點的一個鄰域中各點值的中值代替,讓周圍的像素值接近的真實值,從而消除孤立的雜訊點,對於 斑點雜訊(speckle noise)和椒鹽雜訊(salt-and-pepper noise) 來說尤其有用,因為它不依賴於鄰域內那些與典型值差別很大的值。中值濾波器在處理連續圖像窗函數時與線性濾波器的工作方式類似,但濾波過程卻不再是加權運算。
中值濾波在一定的條件下可以克服常見線性濾波器如最小均方濾波、方框濾波器、均值濾波等帶來的圖像細節模糊,而且對濾除脈沖干擾及圖像掃描雜訊非常有效,也常用於保護邊緣信息, 保存邊緣的特性使它在不希望出現邊緣模糊的場合也很有用,是非常經典的平滑雜訊處理方法。
與均值濾波比較:
說明:中值濾波在一定條件下,可以克服線性濾波器(如均值濾波等)所帶來的圖像細節模糊,而且對濾除脈沖干擾即圖像掃描雜訊最為有效。在實際運算過程中並不需要圖像的統計特性,也給計算帶來不少方便。 但是對一些細節多,特別是線、尖頂等細節多的圖像不宜採用中值濾波。
雙邊濾波(Bilateral filter)是一種非線性的濾波方法,是結合 圖像的空間鄰近度和像素值相似度 的一種折衷處理,同時考慮空域信息和灰度相似性,達到保邊去噪的目的。具有簡單、非迭代、局部的特點。
雙邊濾波器的好處是可以做邊緣保存(edge preserving),一般過去用的維納濾波或者高斯濾波去降噪,都會較明顯地模糊邊緣,對於高頻細節的保護效果並不明顯。雙邊濾波器顧名思義比高斯濾波多了一個高斯方差 sigma-d ,它是基於空間分布的高斯濾波函數,所以在邊緣附近,離的較遠的像素不會太多影響到邊緣上的像素值,這樣就保證了邊緣附近像素值的保存。 但是由於保存了過多的高頻信息,對於彩色圖像里的高頻雜訊,雙邊濾波器不能夠干凈的濾掉,只能夠對於低頻信息進行較好的濾波。
運行結果
學習目標:
形態變換是基於圖像形狀的一些簡單操作。它通常在二進制圖像上執行。
膨脹與腐蝕實現的功能
侵蝕的基本思想就像土壤侵蝕一樣,它會侵蝕前景物體的邊界(總是試圖保持前景為白色)。那它是做什麼的?內核在圖像中滑動(如在2D卷積中)。只有當內核下的所有像素都是 1 時,原始圖像中的像素( 1 或 0 )才會被視為 1 ,否則它將被侵蝕(變為零)
erode(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) -> dst
與腐蝕的操作相反。如果內核下的至少一個像素為「1」,則像素元素為「1」。因此它增加了圖像中的白色區域或前景對象的大小增加。通常,在去除噪音的情況下,侵蝕之後是擴張。因為,侵蝕會消除白雜訊,但它也會縮小我們的物體。所以我們擴大它。由於噪音消失了,它們不會再回來,但我們的物體區域會增加。它也可用於連接對象的破碎部分