A. 18 圖像分割和分水嶺演算法——opencv的各種操作(第三部分 圖像處理的各種方法)
圖像分割和分水嶺演算法是opencv中的圖像處理方法,旨在將灰度圖像中的不同區域進行分離。這一理論將圖像視為地形表面,利用顏色填充和障礙構建過程模擬水流,最終得到分割結果。
然而,實際圖像中可能存在噪點或不規則性,導致過度分割。為解決這一問題,OpenCV引入了基於標記的分水嶺演算法,允許用戶指定合並和不合並的區域,實現互動式圖像分割。用戶通過為前景或物體區域標記不同顏色(或強度),背景區域標記另一種顏色,不確定區域標記為0。應用分水嶺演算法後,標記將根據給定標簽更新,對象邊界將標記為-1。
下面示例展示了如何使用距離變換和分水嶺演算法分割相互接觸的對象。首先,處理硬幣圖像,去除雜訊和填充小孔,識別前景和背景。確定硬幣區域,使用侵蝕操作或距離變換方法。接著,創建標記數組,標記已確定的前景、背景和不確定區域。通過cv.connectedComponents()函數實現,背景標記為0,其他對象用正整數標記。最後,應用分水嶺演算法,修改標記圖像,邊界區域標記為-1。
實際應用中,距離變換和分水嶺演算法配合使用,能有效分割相互接觸的對象。調整參數和方法,可以針對不同場景和需求優化圖像分割效果。查看官方文檔獲取更多關於opencv圖像處理技術的詳細信息和實現指南。
B. 圖像輪廓和分水嶺演算法
圖像輪廓和分水嶺演算法在圖像處理中扮演著關鍵角色。findContours()函數是尋找二值圖像中輪廓的核心工具,它能檢測輪廓後,通過drawContours()函數將這些輪廓清晰地呈現出來,便於分析和理解圖像結構。
drawContours()函數則用於在原始圖像中精確地繪制輪廓,無論是外部輪廓還是內部結構,都能清晰可見。例如,通過運用圖像平滑技術(blur()函數)和邊緣檢測技術(canny()函數),可以動態地根據滑動條調整,實時顯示出圖形的輪廓變化。
對於分水嶺演算法,它在圖像分割中有獨特應用。盡管具體的例子代碼沒有在文中給出,但通過該演算法,圖像可以被分割成不同的區域,像是水在地形中的自然流動。分水嶺演算法的結果通常以視覺效果的形式展示,直觀地揭示圖像的結構差異。
如果你對圖像處理演算法感興趣,特別是OpenCV的相關技術,不妨關注我的微信公眾號「OpenCV圖像處理演算法」。在這里,我將分享我在學習過程中的經驗,包括特徵提取、目標跟蹤、定位、機器學習和深度學習等多個領域的實例,每篇文章都包含詳細的源碼和相關資料,期待與你一同探索和學習。
C. 分水嶺圖像分割中,常常用梯度圖像代替原始圖像作為分水嶺演算法的輸入的原因
分水嶺演算法是數學形態學分割方法中的經典演算法,它將圖像看作是地形學上被水覆蓋的自然地貌,圖像中的每一像素的灰度值表示該點的海拔高度,其每一個局部極小值及其影響區域稱為集水盆,集水盆的邊界則是分水嶺,在各極小區域的表面打一個小孔,同時讓水從小孔中湧出,並慢慢淹沒極小區域周圍的區域,那麼各極小區域波及的范圍,即是相應的集水盆,對應圖像中的區域;不同區域的水流相遇時的界限,就是期望得到的分水嶺,對應區域的邊緣。分水嶺變換可以保證分割區域的連續性和封閉性。
分水嶺變換是從局部極小點開始,即只能是在梯度圖中用, 原始圖是轉換後才能用於分水嶺變換的
一般圖像中存在多個極小值點,通常會存在過分割現象,可以採用梯度閾值分割改進或者採用標記分水嶺演算法將多個極小值區域連在一起
opencv提供分水嶺的代碼 可以找來看一下
D. 如何從入門開始學習OpenCV
方法如下:
先去下載最新版OpenCV,網址如下:http://nchc.dl.sourceforge.net/project/opencvlibrary/opencv-win/2.4.3/OpenCV-2.4.3.exe。下載完成後解壓到相應目錄。本人解壓到D:Program FilesOpenCV2.4.3。
有的文章提到使用CMake把OpenCV下面的範例生成為Visual Studio的工程,此處我沒有這樣做。直接使用範例。這里先把OpenCV目錄下面的幾個重要目錄做個說明:
doc目錄:主要包含OpenCV的幫助文檔。其中opencv2refman.pdf主要是OpenCV的各種類和函數的使用說明。
opencv_tutorials.pdf,主要是下面教學代碼目錄裡面各個教學範例的簡單講解。
opencv_cheatsheet.pdf主要是最常用OpenCV類和函數的集合。此3個PDF文檔對自學者幫助最大。
samplescpp utorial_code目錄:裡麵包含基本教學代碼。和上面的opencv_tutorials.pdf文檔遙相呼應,構成一個完整的自學體系。
build目錄:包含編譯,調試,發布所需要的各類動態庫,靜態庫,頭文件等。因為OpenCV2.4.3好像只支持Visual Studio 2008以上版本,我在這里以Visual Studio 2008為例講解如何讓範例跑起來。
添加環境變數:此處我在path環境變數中添加如下目錄:D:Program FilesOpenCV2.4.3uildx86vc9in。記住在前面一個目錄後面加分號。
在Visual Studio中包含頭文件目錄:見附件中的圖片,已經用紅色矩形框標識如何操作。
在Visual Studio中包含庫文件目錄:見附件中的圖片,已經用紅色矩形框標識如何操作。4
建立一個新建Visual Studio VC win32控制台應用工程,這里我選擇帶預編譯頭的工程,省去添加cpp文件的工作。
代碼創建:這里我選擇samplescpp utorial_codeImgProcMorphology_2.cpp文件。先添加包含目錄,如下(以後所有範例均可以如下添加):#include <opencv2/opencv.hpp>#include <stdio.h>然後復制代碼。
編譯文件:自然少不了要包含靜態庫,要添加的庫(debug版和release差別就是文件名後多了一個d標識是debug版)如下:
debug版:
opencv_calib3d243d.lib
opencv_contrib243d.lib
opencv_core243d.lib
opencv_features2d243d.lib
opencv_flann243d.lib
opencv_gpu243d.lib
opencv_haartraining_engined.lib
ibrelease版:
opencv_calib3d243.lib
opencv_contrib243.lib
opencv_core243.lib
opencv_features2d243.lib
opencv_flann243.lib
opencv_gpu243.lib
字元集設置:如果編譯過程中出現如下錯誤:不能將參數 1 從「_TCHAR *」轉換為「const std::string &」原因如下: 無法從「_TCHAR *」轉換為「const std::string」。請字元集設置為「使用多位元組字元集」。
最後指定命令後參數:方法見附件。這樣就可以不用在windows命令行下輸入參數了,方便調試,但是要注意,圖片必須放在你所建立的工程目錄下(和.cpp以及.h文件同一目錄)。否則就要加上相應的路徑。如果參數多於1個,請以空格分開。
支持所有參數設置完成,開始編譯運行吧。如果Visual Studio無問題的話,按照以上按部就班操作,每個範例均可以正常運行。
E. 如何從入門開始學習OpenCV
如何從入門開始學習OpenCV
OpenCV只是個lib,它既不是軟體、也不是編程語言,所以我覺得從頭到尾按照教程來看一遍可能會存在學習枯燥、無的放矢的局面。
最好的方法是帶著問題去學,先從最簡單的地方入手,比如調用OpenCV的GUI界面來調節一幅圖像的灰度,再復雜些可以利用滑鼠交互來實現PS的魔棒效果(分水嶺演算法)等等,這些網上都有很多現成的代碼來學習,OpenCV 中文論壇上也有不少大牛來回答問題。
單純的學習OpenCV的人不多,學習OpenCV只是為了更方便的編程,所以某種角度來看
OpenCV只是把鋒利的快刀,用刀本身不是目的,用刀切出有型的菜才是目的。
如果沒有編程語言的要求,建議從Python 2.7 +OpenCV 2.4X 入手,為解決問題而思考,有種用Matlab的暢快感。
《Learning OpenCV》是本好書,可以在入門後作為工具書查閱。