欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python使用Opencv實現邊緣檢測以及輪廓檢測的實現

 更新時間:2020年12月31日 10:46:15   作者:Xy-Huang  
這篇文章主要介紹了Python使用Opencv實現邊緣檢測以及輪廓檢測的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

邊緣檢測

Canny邊緣檢測器是一種被廣泛使用的算法,并被認為是邊緣檢測最優(yōu)的算法,該方法使用了比高斯差分算法更復雜的技巧,如多向灰度梯度和滯后閾值化。

Canny邊緣檢測器算法基本步驟:

  • 平滑圖像:通過使用合適的模糊半徑執(zhí)行高斯模糊來減少圖像內的噪聲。
  • 計算圖像的梯度:這里計算圖像的梯度,并將梯度分類為垂直、水平和斜對角。這一步的輸出用于在下一步中計算真正的邊緣。
  • 非最大值抑制:利用上一步計算出來的梯度方向,檢測某一像素在梯度的正方向和負方向上是否是局部最大值,如果是,則抑制該像素(像素不屬于邊緣)。這是一種邊緣細化技術,用最急劇的變換選出邊緣點。
  • 用滯后閾值化選擇邊緣:最后一步,檢查某一條邊緣是否明顯到足以作為最終輸出,最后去除所有不明顯的邊緣。

Opencv使用Canny邊緣檢測相對簡單,代碼如下:

import cv2
import numpy as np

img = cv2.imread("hammer.jpg", 0)
cv2.imwrite("canny.jpg", cv2.Canny(img, 200, 300))
cv2.imshow("canny", cv2.imread("canny.jpg"))
cv2.waitKey()
cv2.destroyAllWindows()

運行結果:

這里寫圖片描述

Canny函數的原型為

cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]]) 

必要參數:
第一個參數是需要處理的原圖像,該圖像必須為單通道的灰度圖;
第二個參數是滯后閾值1;
第三個參數是滯后閾值2。

輪廓檢測

輪廓檢測主要由cv2.findContours函數實現的。
函數的原型為

cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]]) 

函數參數
第一個參數是尋找輪廓的圖像;

第二個參數表示輪廓的檢索模式,有四種(本文介紹的都是新的cv2接口):

  • cv2.RETR_EXTERNAL表示只檢測外輪廓 。
  • cv2.RETR_LIST檢測的輪廓不建立等級關系。
  • cv2.RETR_CCOMP建立兩個等級的輪廓,上面的一層為外邊界,里面的一層為內孔的邊界信息。如果內孔內還有一個連通物體,這個物體的邊界也在頂層。
  • cv2.RETR_TREE建立一個等級樹結構的輪廓。

第三個參數method為輪廓的逼近方法

  • cv2.CHAIN_APPROX_NONE存儲所有的輪廓點,相鄰的兩個點的像素位置差不超過1,即max(abs(x1-x2),abs(y2-y1))==1。
  • cv2.CHAIN_APPROX_SIMPLE壓縮水平方向,垂直方向,對角線方向的元素,只保留該方向的終點坐標,例如一個矩形輪廓只需4個點來保存輪廓信息。
  • cv2.CHAIN_APPROX_TC89_L1和cv2.CHAIN_APPROX_TC89_KCOS都是使用teh-Chinl chain近似算法。

返回值

如:image, contours, hier = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

image:是原圖像

contours:圖像的輪廓,以列表的形式表示,每個元素都是圖像中的一個輪廓。

hier:相應輪廓之間的關系。這是一個ndarray,其中的元素個數和輪廓個數相同,每個輪廓contours[i]對應4個hierarchy元素hierarchy[i][0] ~hierarchy[i][3],分別表示后一個輪廓、前一個輪廓、父輪廓、內嵌輪廓的索引編號,如果沒有對應項,則該值為負數。

原圖:

這里寫圖片描述

示例一

import cv2
import numpy as np

img = cv2.pyrDown(cv2.imread("hammer.jpg", cv2.IMREAD_UNCHANGED))
# threshold 函數對圖像進行二化值處理,由于處理后圖像對原圖像有所變化,因此img.copy()生成新的圖像,cv2.THRESH_BINARY是二化值
ret, thresh = cv2.threshold(cv2.cvtColor(img.copy(), cv2.COLOR_BGR2GRAY), 127, 255, cv2.THRESH_BINARY)
# findContours函數查找圖像里的圖形輪廓
# 函數參數thresh是圖像對象
# 層次類型,參數cv2.RETR_EXTERNAL是獲取最外層輪廓,cv2.RETR_TREE是獲取輪廓的整體結構
# 輪廓逼近方法
# 輸出的返回值,image是原圖像、contours是圖像的輪廓、hier是層次類型
image, contours, hier = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

for c in contours:
  # 輪廓繪制方法一
  # boundingRect函數計算邊框值,x,y是坐標值,w,h是矩形的寬和高
  x, y, w, h = cv2.boundingRect(c)
  # 在img圖像畫出矩形,(x, y), (x + w, y + h)是矩形坐標,(0, 255, 0)設置通道顏色,2是設置線條粗度
  cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)

  # 輪廓繪制方法二
  # 查找最小區(qū)域
  rect = cv2.minAreaRect(c)
  # 計算最小面積矩形的坐標
  box = cv2.boxPoints(rect)
  # 將坐標規(guī)范化為整數
  box = np.int0(box)
  # 繪制矩形
  cv2.drawContours(img, [box], 0, (0, 0, 255), 3)

  # 輪廓繪制方法三
  # 圓心坐標和半徑的計算
  (x, y), radius = cv2.minEnclosingCircle(c)
  # 規(guī)范化為整數
  center = (int(x), int(y))
  radius = int(radius)
  # 勾畫圓形區(qū)域
  img = cv2.circle(img, center, radius, (0, 255, 0), 2)

# # 輪廓繪制方法四
# 圍繞圖形勾畫藍色線條
cv2.drawContours(img, contours, -1, (255, 0, 0), 2)
# 顯示圖像
cv2.imshow("contours", img)
cv2.waitKey()
cv2.destroyAllWindows()

運行結果如圖所示:

這里寫圖片描述

示例二

import cv2
import numpy as np

img = cv2.pyrDown(cv2.imread("hammer.jpg", cv2.IMREAD_UNCHANGED))
ret, thresh = cv2.threshold(cv2.cvtColor(img.copy(), cv2.COLOR_BGR2GRAY) , 127, 255, cv2.THRESH_BINARY)
# findContours函數查找圖像里的圖形輪廓
# 函數參數thresh是圖像對象
# 層次類型,參數cv2.RETR_EXTERNAL是獲取最外層輪廓,cv2.RETR_TREE是獲取輪廓的整體結構
# 輪廓逼近方法
# 輸出的返回值,image是原圖像、contours是圖像的輪廓、hier是層次類型
image, contours, hier = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 創(chuàng)建新的圖像black
black = cv2.cvtColor(np.zeros((img.shape[1], img.shape[0]), dtype=np.uint8), cv2.COLOR_GRAY2BGR)


for cnt in contours:
  # 輪廓周長也被稱為弧長??梢允褂煤瘮?cv2.arcLength() 計算得到。這個函數的第二參數可以用來指定對象的形狀是閉合的(True) ,還是打開的(一條曲線)
  epsilon = 0.01 * cv2.arcLength(cnt, True)
  # 函數approxPolyDP來對指定的點集進行逼近,cnt是圖像輪廓,epsilon表示的是精度,越小精度越高,因為表示的意思是是原始曲線與近似曲線之間的最大距離。
  # 第三個函數參數若為true,則說明近似曲線是閉合的,它的首位都是相連,反之,若為false,則斷開。
  approx = cv2.approxPolyDP(cnt, epsilon, True)
  # convexHull檢查一個曲線的凸性缺陷并進行修正,參數cnt是圖像輪廓。
  hull = cv2.convexHull(cnt)
  # 勾畫圖像原始的輪廓
  cv2.drawContours(black, [cnt], -1, (0, 255, 0), 2)
  # 用多邊形勾畫輪廓區(qū)域
  cv2.drawContours(black, [approx], -1, (255, 255, 0), 2)
  # 修正凸性缺陷的輪廓區(qū)域
  cv2.drawContours(black, [hull], -1, (0, 0, 255), 2)
# 顯示圖像
cv2.imshow("hull", black)
cv2.waitKey()
cv2.destroyAllWindows()

運行結果如圖所示:

這里寫圖片描述

參考資料:OpenCV 3計算機視覺 Python語言實現第二版

到此這篇關于Python使用Opencv實現邊緣檢測以及輪廓檢測的實現的文章就介紹到這了,更多相關Python 邊緣檢測內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python中內置的日志模塊logging用法詳解

    Python中內置的日志模塊logging用法詳解

    Python的logging模塊提供了記錄程序運行情況的日志功能,類似于Apache的log4j,很好很強大,這里我們就來看一下Python中內置的日志模塊logging用法詳解
    2016-07-07
  • python實現階乘的三種方法

    python實現階乘的三種方法

    階乘是基斯頓·卡曼于 1808 年發(fā)明的運算符號,是數學術語,一個正整數的階乘(factorial)是所有小于及等于該數的正整數的積,并且0的階乘為1,本文給大家介紹了python實現階乘的三種方法,通過代碼示例介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • django 解決model中類寫不到數據庫中,數據庫無此字段的問題

    django 解決model中類寫不到數據庫中,數據庫無此字段的問題

    這篇文章主要介紹了django 解決model中類寫不到數據庫中,數據庫無此字段的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨想過來看看吧
    2020-05-05
  • 詳解python使用turtle庫來畫一朵花

    詳解python使用turtle庫來畫一朵花

    這篇文章主要介紹了python使用turtle庫來畫一朵花,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • Python接口自動化淺析登錄接口測試實戰(zhàn)

    Python接口自動化淺析登錄接口測試實戰(zhàn)

    本文主要接好了python接口自動化的接口概念、接口用例設計及登錄,跟隨本文章來進行一個接口用例設計及登錄接口測試實戰(zhàn),有需要的朋友可以參考下
    2021-08-08
  • tensorboard實現同時顯示訓練曲線和測試曲線

    tensorboard實現同時顯示訓練曲線和測試曲線

    今天小編就為大家分享一篇tensorboard實現同時顯示訓練曲線和測試曲線,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • Python常用正則表達式符號淺析

    Python常用正則表達式符號淺析

    這篇文章主要介紹了Python常用正則表達式符號,非常實用,需要的朋友可以參考下
    2014-08-08
  • 使用Python的Dataframe取兩列時間值相差一年的所有行方法

    使用Python的Dataframe取兩列時間值相差一年的所有行方法

    今天小編就為大家分享一篇使用Python的Dataframe取兩列時間值相差一年的所有行方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Flask表單與表單驗證實現流程介紹

    Flask表單與表單驗證實現流程介紹

    這篇文章主要介紹了python中Flask?Web?表單的使用方法介紹,表單的操作是Web程序開發(fā)中最核心的模塊之一,絕大多數的動態(tài)交互功能都是通過表單的形式實現的。更多介紹需要的小伙伴可以參考下面文章內容
    2022-09-09
  • 讓Django的BooleanField支持字符串形式的輸入方式

    讓Django的BooleanField支持字符串形式的輸入方式

    這篇文章主要介紹了讓Django的BooleanField支持字符串形式的輸入方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05

最新評論