python 邊緣與輪廓檢測

閱讀時間約 3 分鐘
要畫輪廓要先有邊緣檢測
邊緣檢測Edge detection是影像處理,幫助電腦可以抓取圖片中的物體,這項技術以檢查影像中各像素點的顏色變化來區分邊界,有邊緣之後,可以再從這些交錯的線條得到物體輪廓。
邊緣檢測 vs. 輪廓檢測
在圖像中有個容易搞混的概念,邊緣與輪廓的差異是什麼?
邊緣檢測:檢測圖像中像素的值有突然改變的地方。
輪廓檢測:檢測圖像中的物體邊界,也就像找出物體的邊界。
因此要知道有邊緣的地方不一定有邊界,有邊界的地方也不一定有邊緣。
邊緣檢測Edge detection
Python的opencv提供三種邊緣檢測的方法:Laplacian、Sobel、Canny,這三個技術都是利用灰階圖片,基於每個像素灰值的不同,利用不同物體在其邊界處會有明顯的邊緣特徵來檢測。
這三種方法可依技術原理分為兩種,以下為其餘補充事項。
Laplacian:對於圖片的雜訊相當敏感,因此通常會先將影像模糊化再做處理。
Sobel與Canny:這兩個方法擁有相同的底層技術,差異在於執行方式,Sobel以簡單的卷積過濾器偵測圖像上水平及縱向光度的改變,以加權平均方式計算各點的數值來決定邊緣。而Canny先將影像模糊化再進行非極大值抑制,因為Canny有先經過影像模糊化,故比較能處理影像雜訊問題。
編寫程式碼該注意事項
Laplacian
使用opencv中的Laplacian函式須指定輸出的影像浮點格式CV_64F,為什麼是使用64bits而非灰階的8bits呢?
因為Laplacian過程需進行black-to-white及white-to-black兩種轉換,在微分的梯度計算中black-to-white屬於正向的運算而white-to-black則是負向,灰階的8bits格式僅能儲存0-255的正值,因此必須使用64bits。
接下來須取其絕對值並轉為8bit的灰階資訊,這是一般在運行Laplacian運算時所建議的方法,網上的說法是此方式可保留所有的邊緣資訊:先轉出為64bit,再取絕對值轉為8bit。
Sobel
Sobel可以單獨針對X軸、Y軸、X與Y軸抓取其邊緣。
Canny
Canny 的邊緣檢測方法是先將影響模糊化去除不必要的資訊,再使用類似Sobel的方式取的XY軸邊緣。
Canny函式的第二與第三個參數是門檻參數,意指圖像的任一點像素,若其值大於threshold2,則認定它屬於邊緣像素,若小於threshold1則不為邊緣像素,介於兩者之間則由程式依其像素強度值運算後決定。
程式碼與實作效果
程式碼連結:https://gist.github.com/IvyQQQQQ/30e57cc081da76399c267d344a7b8dbb
輪廓檢測
使用上面的方法找出邊緣後,接下來便是確定輪廓。輪廓是一連串沒有間斷的點所組成的曲線。我們可借助opencv中的 cv2.findContours找到輪廓,利用cv2.boundingRect依照前面跑出的結果取出物體。圖像處理步驟如下:
程式碼與實作效果
程式碼連結:https://gist.github.com/IvyQQQQQ/e3dc2d7f69211fd5790fcf78bbd93905
參考連結
https://chtseng.wordpress.com/2016/12/05/opencv-edge-detection%E9%82%8A%E7%B7%A3%E5%81%B5%E6%B8%AC/
為什麼會看到廣告
10會員
17內容數
關於多益的單字整理、記憶方法、心路歷程、英文的基礎概念。
留言0
查看全部
發表第一個留言支持創作者!
薰魚的沙龍 的其他內容
編譯器與直譯器
物件導向的概念,以python程式為範例。
用python寫出應用筆電相機儲存照片。
編譯器與直譯器
物件導向的概念,以python程式為範例。
用python寫出應用筆電相機儲存照片。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
  在計算數字時我們要先搞懂運算符號代表的涵義,Python裡面的符號跟我們認知的不會有太大的差別,但是有一些代表不一樣的意思,就必須搞懂才不會在寫程式時,程式碼的重複性太高,會導致日後的維修性降低。
Thumbnail
常常會遇到好不容易寫好程式,但是輸出的時候沒辦法按照自己想要的格式,或是間隔來輸出,這時需要用到的就是格式化輸出,格式化輸出就是調整排版的一個形式。
Thumbnail
一、什麼是變數?   變數是指用來代表某一種資料型態的符號,以非數字的符號來表達,可以是英文字母也可以是一個英文單字,不過python有一些英文字母不能被當作變數,我們稱作保留字,例如:False、None、True、and、is、not、or、......,之後會在介紹。
Thumbnail
IDE是甚麼? IDE又叫做整合開發環境(Integrated Development Environment),在編輯程式碼時有許多的步驟,例如撰寫、編譯、除錯、執行......等過程,都是分開進行,但現在可以在同一個環境下開發,而使用的這些環境正是IDE。
Thumbnail
PYTHON 介紹 Python 是一種被廣泛使用的高階編程語言,它的用途十分廣泛,支援了多種的程式設計的範式,包括函數式、指令式、結構化、物件導向。 Python的設計哲學強調了它簡潔的語法,是使用空格縮進來劃分程式碼。 Python是的社群中擁有許多模組可以使用,在進行某些用途時可以很引入模組,
所有東西在電腦底層皆是位元(0或1),位元以定位記法來表示資料(如ASCII編碼中 01000001表示A),資料透過CPU內建的處理程序組成機械語言,機械語言能完成數學運算。但機械語言的表示0和1的組成,難以直接編寫程式,因此又設計出了一套用字母、符號、數字來對應機械語言的語法──組合語言,為了更
Thumbnail
幾週前開始線上學習 Python,一路完成了十九關的關卡,也就是十九堂基礎課程。整體來說前面一到十四關都不算難度高,但越到後面其實更需要耗費許多專注心力與邏輯思考,無奈自己時而處理其他日常工作,變成全神貫注學習的完整時間幾乎被打碎。所以到後半段,已經不太能花時間坐在電腦前想清楚一整段的代碼要怎麼布建
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
  在計算數字時我們要先搞懂運算符號代表的涵義,Python裡面的符號跟我們認知的不會有太大的差別,但是有一些代表不一樣的意思,就必須搞懂才不會在寫程式時,程式碼的重複性太高,會導致日後的維修性降低。
Thumbnail
常常會遇到好不容易寫好程式,但是輸出的時候沒辦法按照自己想要的格式,或是間隔來輸出,這時需要用到的就是格式化輸出,格式化輸出就是調整排版的一個形式。
Thumbnail
一、什麼是變數?   變數是指用來代表某一種資料型態的符號,以非數字的符號來表達,可以是英文字母也可以是一個英文單字,不過python有一些英文字母不能被當作變數,我們稱作保留字,例如:False、None、True、and、is、not、or、......,之後會在介紹。
Thumbnail
IDE是甚麼? IDE又叫做整合開發環境(Integrated Development Environment),在編輯程式碼時有許多的步驟,例如撰寫、編譯、除錯、執行......等過程,都是分開進行,但現在可以在同一個環境下開發,而使用的這些環境正是IDE。
Thumbnail
PYTHON 介紹 Python 是一種被廣泛使用的高階編程語言,它的用途十分廣泛,支援了多種的程式設計的範式,包括函數式、指令式、結構化、物件導向。 Python的設計哲學強調了它簡潔的語法,是使用空格縮進來劃分程式碼。 Python是的社群中擁有許多模組可以使用,在進行某些用途時可以很引入模組,
所有東西在電腦底層皆是位元(0或1),位元以定位記法來表示資料(如ASCII編碼中 01000001表示A),資料透過CPU內建的處理程序組成機械語言,機械語言能完成數學運算。但機械語言的表示0和1的組成,難以直接編寫程式,因此又設計出了一套用字母、符號、數字來對應機械語言的語法──組合語言,為了更
Thumbnail
幾週前開始線上學習 Python,一路完成了十九關的關卡,也就是十九堂基礎課程。整體來說前面一到十四關都不算難度高,但越到後面其實更需要耗費許多專注心力與邏輯思考,無奈自己時而處理其他日常工作,變成全神貫注學習的完整時間幾乎被打碎。所以到後半段,已經不太能花時間坐在電腦前想清楚一整段的代碼要怎麼布建