最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python使用Opencv實(shí)現(xiàn)邊緣檢測(cè)以及輪廓檢測(cè)的實(shí)現(xiàn)

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

邊緣檢測(cè)

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

Canny邊緣檢測(cè)器算法基本步驟:

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

Opencv使用Canny邊緣檢測(cè)相對(duì)簡(jiǎn)單,代碼如下:

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()

運(yùn)行結(jié)果:

這里寫(xiě)圖片描述

Canny函數(shù)的原型為

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

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

輪廓檢測(cè)

輪廓檢測(cè)主要由cv2.findContours函數(shù)實(shí)現(xiàn)的。
函數(shù)的原型為

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

函數(shù)參數(shù)
第一個(gè)參數(shù)是尋找輪廓的圖像;

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

  • cv2.RETR_EXTERNAL表示只檢測(cè)外輪廓 。
  • cv2.RETR_LIST檢測(cè)的輪廓不建立等級(jí)關(guān)系。
  • cv2.RETR_CCOMP建立兩個(gè)等級(jí)的輪廓,上面的一層為外邊界,里面的一層為內(nèi)孔的邊界信息。如果內(nèi)孔內(nèi)還有一個(gè)連通物體,這個(gè)物體的邊界也在頂層。
  • cv2.RETR_TREE建立一個(gè)等級(jí)樹(shù)結(jié)構(gòu)的輪廓。

第三個(gè)參數(shù)method為輪廓的逼近方法

  • cv2.CHAIN_APPROX_NONE存儲(chǔ)所有的輪廓點(diǎn),相鄰的兩個(gè)點(diǎn)的像素位置差不超過(guò)1,即max(abs(x1-x2),abs(y2-y1))==1。
  • cv2.CHAIN_APPROX_SIMPLE壓縮水平方向,垂直方向,對(duì)角線方向的元素,只保留該方向的終點(diǎn)坐標(biāo),例如一個(gè)矩形輪廓只需4個(gè)點(diǎn)來(lái)保存輪廓信息。
  • 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:圖像的輪廓,以列表的形式表示,每個(gè)元素都是圖像中的一個(gè)輪廓。

hier:相應(yīng)輪廓之間的關(guān)系。這是一個(gè)ndarray,其中的元素個(gè)數(shù)和輪廓個(gè)數(shù)相同,每個(gè)輪廓contours[i]對(duì)應(yīng)4個(gè)hierarchy元素hierarchy[i][0] ~hierarchy[i][3],分別表示后一個(gè)輪廓、前一個(gè)輪廓、父輪廓、內(nèi)嵌輪廓的索引編號(hào),如果沒(méi)有對(duì)應(yīng)項(xiàng),則該值為負(fù)數(shù)。

原圖:

這里寫(xiě)圖片描述

示例一

import cv2
import numpy as np

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

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

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

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

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

運(yùn)行結(jié)果如圖所示:

這里寫(xiě)圖片描述

示例二

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函數(shù)查找圖像里的圖形輪廓
# 函數(shù)參數(shù)thresh是圖像對(duì)象
# 層次類(lèi)型,參數(shù)cv2.RETR_EXTERNAL是獲取最外層輪廓,cv2.RETR_TREE是獲取輪廓的整體結(jié)構(gòu)
# 輪廓逼近方法
# 輸出的返回值,image是原圖像、contours是圖像的輪廓、hier是層次類(lèi)型
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:
  # 輪廓周長(zhǎng)也被稱(chēng)為弧長(zhǎng)??梢允褂煤瘮?shù) cv2.arcLength() 計(jì)算得到。這個(gè)函數(shù)的第二參數(shù)可以用來(lái)指定對(duì)象的形狀是閉合的(True) ,還是打開(kāi)的(一條曲線)
  epsilon = 0.01 * cv2.arcLength(cnt, True)
  # 函數(shù)approxPolyDP來(lái)對(duì)指定的點(diǎn)集進(jìn)行逼近,cnt是圖像輪廓,epsilon表示的是精度,越小精度越高,因?yàn)楸硎镜囊馑际鞘窃记€與近似曲線之間的最大距離。
  # 第三個(gè)函數(shù)參數(shù)若為true,則說(shuō)明近似曲線是閉合的,它的首位都是相連,反之,若為false,則斷開(kāi)。
  approx = cv2.approxPolyDP(cnt, epsilon, True)
  # convexHull檢查一個(gè)曲線的凸性缺陷并進(jìn)行修正,參數(shù)cnt是圖像輪廓。
  hull = cv2.convexHull(cnt)
  # 勾畫(huà)圖像原始的輪廓
  cv2.drawContours(black, [cnt], -1, (0, 255, 0), 2)
  # 用多邊形勾畫(huà)輪廓區(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()

運(yùn)行結(jié)果如圖所示:

這里寫(xiě)圖片描述

參考資料:OpenCV 3計(jì)算機(jī)視覺(jué) Python語(yǔ)言實(shí)現(xiàn)第二版

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

相關(guān)文章

  • python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5窗口類(lèi)QMainWindow詳細(xì)使用方法

    python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5窗口類(lèi)QMainWindow詳細(xì)使用方法

    這篇文章主要介紹了python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5窗口類(lèi)QMainWindow詳細(xì)使用方法,需要的朋友可以參考下
    2020-02-02
  • python使用tcp實(shí)現(xiàn)局域網(wǎng)內(nèi)文件傳輸

    python使用tcp實(shí)現(xiàn)局域網(wǎng)內(nèi)文件傳輸

    這篇文章主要介紹了python使用tcp實(shí)現(xiàn)局域網(wǎng)內(nèi)文件傳輸,文件包括文本,圖片,視頻等,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • python基于python-docx庫(kù)自動(dòng)化處理Word文檔的完整指南

    python基于python-docx庫(kù)自動(dòng)化處理Word文檔的完整指南

    python-docx是一款純Python實(shí)現(xiàn)的第三方庫(kù),專(zhuān)門(mén)用于創(chuàng)建和修改Microsoft?Word的.docx格式文檔,下面我們就來(lái)看看如何使用python-docx庫(kù)自動(dòng)化處理Word文檔吧
    2026-01-01
  • 基于Python編寫(xiě)一個(gè)中秋節(jié)嫦娥投食小游戲

    基于Python編寫(xiě)一個(gè)中秋節(jié)嫦娥投食小游戲

    今天給大家?guī)?lái)的是給玉兔投喂月餅的小游戲。八月十五中秋夜晚,讓我們對(duì)著月亮許愿:希望我們?cè)谝夂驮谝馕覀兊娜?,諸邪避退、百事無(wú)忌、平安喜樂(lè)、萬(wàn)事勝意。提前祝大家中秋節(jié)快樂(lè)
    2022-09-09
  • Python獲取PDF文檔的各種頁(yè)面信息

    Python獲取PDF文檔的各種頁(yè)面信息

    了解PDF頁(yè)面信息對(duì)于有效處理、編輯和管理PDF文件至關(guān)重要,PDF文件通常包含多個(gè)頁(yè)面,每個(gè)頁(yè)面可能有不同的尺寸、方向、旋轉(zhuǎn)角度以及其他屬性,這篇文章將介紹如何使用Python獲取PDF文檔的各種頁(yè)面信息,需要的朋友可以參考下
    2025-02-02
  • pycharm?終端部啟用虛擬環(huán)境詳情

    pycharm?終端部啟用虛擬環(huán)境詳情

    這篇文章主要介紹了pycharm?終端部啟用虛擬環(huán)境詳情,文章圍繞pycharm?終端部啟用虛擬環(huán)境商務(wù)相關(guān)資料展開(kāi)全文章的詳細(xì)內(nèi)容,需要的小伙伴可以參考一下
    2021-12-12
  • Python內(nèi)置模塊hashlib、hmac與uuid用法分析

    Python內(nèi)置模塊hashlib、hmac與uuid用法分析

    這篇文章主要介紹了Python內(nèi)置模塊hashlib、hmac與uuid用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了hashlib、hmac與uuid模塊的概念、功能及簡(jiǎn)單使用方法,需要的朋友可以參考下
    2018-02-02
  • Python編程實(shí)現(xiàn)小姐姐跳舞并生成詞云視頻示例

    Python編程實(shí)現(xiàn)小姐姐跳舞并生成詞云視頻示例

    本文用Python做了一個(gè)詞云視頻,以另一種角度來(lái)看小姐姐跳舞視頻左半部分是小姐姐跳舞視頻,右半部分是根據(jù)動(dòng)作生成的的詞云視頻,有需要的朋友可以借鑒參考下
    2021-10-10
  • 5種Python統(tǒng)計(jì)次數(shù)方法技巧

    5種Python統(tǒng)計(jì)次數(shù)方法技巧

    這篇文章主要給大家分享的是5種Python統(tǒng)計(jì)次數(shù)方法技巧,文章主要包括字典 dict 統(tǒng)計(jì)、collections.defaultdict 統(tǒng)計(jì)、List count方法、集合(set)和列表(list)統(tǒng)計(jì)、collections.Counter方法,感興趣的小伙伴一起進(jìn)入下面文章內(nèi)容吧
    2021-11-11
  • 基于Python的XSS測(cè)試工具XSStrike使用方法

    基于Python的XSS測(cè)試工具XSStrike使用方法

    XSS(Cross Site Scripting,跨站腳本攻擊)是一類(lèi)特殊的Web客戶(hù)端腳本注入攻擊手段,通常指攻擊者通過(guò)“HTML注入”篡改了網(wǎng)頁(yè),插入惡意的腳本,從而在用戶(hù)瀏覽網(wǎng)頁(yè)時(shí)控制瀏覽器的一種攻擊。
    2017-07-07

最新評(píng)論

化隆| 建始县| 井冈山市| 崇阳县| 太谷县| 宝山区| 巴彦县| 旅游| 托克托县| 黔东| 旅游| 乌拉特后旗| 策勒县| 同心县| 广饶县| 三江| 胶州市| 江达县| 依安县| 徐闻县| 陇西县| 横峰县| 盱眙县| 浙江省| 大同市| 满洲里市| 应城市| 冷水江市| 阳原县| 苗栗县| 甘南县| 临泽县| 且末县| 怀来县| 枣阳市| 商城县| 阆中市| 耒阳市| 大悟县| 廉江市| 仁化县|