亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么利用Python+OpenCV實現簡易圖像邊緣輪廓檢測

發布時間:2022-05-12 11:30:05 來源:億速云 閱讀:238 作者:iii 欄目:開發技術

本篇內容主要講解“怎么利用Python+OpenCV實現簡易圖像邊緣輪廓檢測”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么利用Python+OpenCV實現簡易圖像邊緣輪廓檢測”吧!

函數基礎與三方庫

本文所用的第三方庫是Opencv4.3

導入第三方庫

import cv2 as cv

由于Opencv顯示圖像比較麻煩,與matlab或matplob不一致,考慮到基礎薄弱可能對此庫的圖像顯示機制不了解,在此我先定義一個img_show函數,目的是更方便的顯示圖像。

def img_show(pic,name):
'''
此函數img_show()用于調用OpenCV的相關函數來進行圖像展示
name為顯示圖像窗口的名稱(name為字符串)
pic為被顯示圖像(pic為opencv imread進來的圖片)
'''
    cv.imshow(pic,name)
    cv.waitkey(0)
    cv.destroyAllWindows()

cv.threshold(pic,thresh,maxvalue,model)

此函數用于圖像單通道不同閾值的操作,一般用來將圖像進行二值化處理,二值化處理將有助于邊緣檢測的梯度計算。
其中pic為待處理圖片,由于是對單通道處理,所以pic一般要轉換為灰度圖

thresh為操作閾值,高于這個閾值的將根據不同的model統一成 0 或 maxvalue

model為操作方法,一般只需要cv.THRESH_BINARY_INV和cv.THRESH_BINARY

…THRESH_BINARY_INV 將大于thresh的設置為0

…THRESH_BINARY 將大于thresh的設置為255

該圖像有兩個返回值,第一個返回值為閾值,即thresh值,第二個為二值圖像的矩陣

cv.findContours(待處理圖片,model(提取模式),method(提取方法))

此函數用于提取pic的輪廓點,pic為二值圖像時,函數提取將更加精準

model 為提取模式 一般用到cv.RETR_EXTERNAL和cv.RETR_TREE

…Extrnal為以外層輪廓的方式進行提取

…Tree則提取圖像內外層所有輪廓

method 為提取方法,有cv.CHAIN_APPROX_NONE和cv.CHAIN_APPROX_SIMPLE

…NONE為以線的方式連接提取出來的輪廓

…SIMPLE則壓縮了線和斜邊,只標記了輪廓的各個頂點

此函數的返回值有兩個,一個是邊緣點(列表形式),一個是層次信息

contours,hierarchy = cv.findContours(pic,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_NONE)

此段代碼的意思是

基于pic 此圖像

使用描述外輪廓的模式

通過各個點鏈接的方式進行輪廓提取

最終得到輪廓列表集合contours和層次關系hierarchy

注:在contours里面有非常多的輪廓集合,比如contours[0]\contours[1]\contours[2]是三個輪廓,可能只有1是目標輪廓,其他均為噪聲輪廓

cv.drawContours(畫布,輪廓集合,索引,顏色,粗細)

此函數用于在指定畫布,用指定顏色粗細的線畫出指定輪廓(索引判斷)或所有輪廓(-1)

畫布:將輪廓點畫在畫布上,一般是代替去圖片的copy圖,不然會污染原圖。

輪廓集合:上文中提到的contours,其中包含了目標輪廓和噪聲輪廓的所有輪廓

索引:選定輪廓集合中的某一輪廓,如果你知道目標輪廓的編號可以直接寫,如果不知道就寫-1,可以畫出所有輪廓

顏色: 元組形式,(255,0,0)為紅色,以此類推

粗細:輪廓的粗細 1~任意整數,太大會覆蓋原圖

cv.boundingRect(圖像)

此函數用于將檢測的函數進行矩陣點的查找

圖像:被檢測的圖像,一般是傳入目標的輪廓,即contours[index],index為目標編號

此函數會返回四個值:x,y,w,h

其中x,y指的是該圖像x軸上最小值和y軸最小值(有左上角為原點時),w,h跟別指的囊括圖像所有的寬和高

代碼實現

#導入opencv
import cv2 as cv

#定義opencv的圖像顯示函數
def img_show(pic,name):
    cv.imshow(pic,name)
    cv.waitKey(0)
    cv.destroyAllWindows()

#彩色模式讀入圖片
eagle_o = cv.imread('eagle.png',1)
# 圖片轉為灰度圖
eagle = cv.cvtColor(eagle_o,cv.COLOR_BGR2GRAY)
# 將圖像轉換為二值圖
ret,eagle_2v = cv.threshold(eagle,125,255,cv.THRESH_BINARY_INV) #ret為閾值,eagl_2v為二值圖
# 基于二值圖像用外輪廓的模式,通過全點連接輪廓的方法提取輪廓
contours,hierarchy = cv.findContours(eagle_2v,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_NONE)
# 在copy圖上畫出所有輪廓
img = cv.drawContours(eagle_o.copy(),contours,-1,(255,25,0),5)
# 獲取目標圖像的最小矩陣,此處29為目標的輪廓
x,y,w,h = cv.boundingRect(contours[29])
# 繪制目標框
img = cv.rectangle(eagle_o,(x,y),(x+w,y+h),(255,255,0),7)
img_show('goal',img)

實現效果

怎么利用Python+OpenCV實現簡易圖像邊緣輪廓檢測

到此,相信大家對“怎么利用Python+OpenCV實現簡易圖像邊緣輪廓檢測”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

那坡县| 新巴尔虎右旗| 卢湾区| 吉隆县| 庆云县| 仪陇县| 比如县| 廉江市| 武平县| 敖汉旗| 儋州市| 新昌县| 绥中县| 赫章县| 穆棱市| 当雄县| 罗源县| 陆良县| 马关县| 克什克腾旗| 乐业县| 灵武市| 怀柔区| 通化县| 河池市| 菏泽市| 扶绥县| 当阳市| 沙坪坝区| 盘锦市| 定远县| 永年县| 牡丹江市| 赫章县| 天柱县| 固始县| 都兰县| 民权县| 宜君县| 马鞍山市| 三穗县|