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

如何使用Python?OpenCV提取物體輪廓詳解

 更新時(shí)間:2022年05月11日 14:58:36   作者:wzw12315  
圖像的輪廓檢測(cè)不論是機(jī)器視覺(jué)還是其他方面都有較大作用,下面這篇文章主要給大家介紹了關(guān)于如何使用Python?OpenCV提取物體輪廓的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

通常提取物體的輪廓時(shí),圖像都存在噪聲,提取效果并不理想。如提取下圖的輪廓時(shí),

提取代碼:

import cv2
 
img = cv2.imread("mouse.png")
cv2.imshow("origin",img)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,binary = cv2.threshold(gray,128,255,cv2.THRESH_BINARY)
cv2.imshow("binary",binary)
 
contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img,contours,-1,(0,0,255),3)
cv2.imshow("result", img)
cv2.waitKey(0)

 提取效果:

可以看出存在非常嚴(yán)重的噪聲干擾。因此,提取輪廓之前需要過(guò)濾噪聲的干擾。

首先,進(jìn)行對(duì)圖像進(jìn)行均值濾波(低通濾波),去除噪聲

blured = cv2.blur(img,(5,5))
cv2.imshow("blur",blured)

 

使用floodfill來(lái)去掉目標(biāo)周圍的背景,泛洪填充類始于ps的魔棒工具,這里用來(lái)清除背景。

mask = np.zeros((h+2, w+2), np.uint8)       #掩碼長(zhǎng)和寬都比輸入圖像多兩個(gè)像素點(diǎn),泛洪填充不會(huì)超出掩碼的非零邊緣  
#進(jìn)行泛洪填充
cv2.floodFill(blured, mask, (10,10), (255,255,255), (2,2,2),(3,3,3),8)
cv2.imshow("floodfill", blured)

  floodFill函數(shù)解析

  • img:為待使用泛洪算法的圖像
  • mask:為掩碼層,使用掩碼可以規(guī)定是在哪個(gè)區(qū)域使用該算法,如果是對(duì)于完整圖像都要使用,則掩碼層大小為原圖行數(shù)+2,列數(shù)+2.是一個(gè)二維的0矩陣,邊緣一圈會(huì)在使用算法是置為1。而只有對(duì)于掩碼層上對(duì)應(yīng)為0的位置才能泛洪,所以掩碼層初始化為0矩?!綿type:np.uint8】
  • seed:為泛洪算法的種子點(diǎn),也是根據(jù)該點(diǎn)的像素判斷決定和其相近顏色的像素點(diǎn),是否被泛洪處理。
  • newvalue:是對(duì)于泛洪區(qū)域新賦的值(B,G,R)
  • (loDiff1,loDiff2,loDiff3):是相對(duì)于seed種子點(diǎn)像素可以往下的像素值,即seed(B0,G0,R0),泛洪區(qū)域下界為(B0-loDiff1,G0-loDiff2,R0-loDiff3)
  • (upDiff1,upDiff2,upDiff3):是相對(duì)于seed種子點(diǎn)像素可以往上的像素值,即seed(B0,G0,R0),泛洪區(qū)域上界為(B0+upDiff1,G0+upDiff2,R0+upDiff3)
  • flag:為泛洪算法的處理模式:
  •     低八位 控制算法的連通性,是以seed點(diǎn)為中心,接著判斷周圍的幾個(gè)像素點(diǎn),再將泛洪區(qū)域像素點(diǎn)周圍的幾個(gè)像素點(diǎn)進(jìn)行考慮。 一般為4,8;默認(rèn)為4
  •     中間八位 與掩碼層賦值密切相關(guān),一般使用(255<<8)使中間8位全位1,則值為255,也就是掩碼層對(duì)應(yīng)原圖的泛洪區(qū)域的部分被由原來(lái)的初值0賦值成255,如果中間8位為0,則賦值為1.
  •     高八位 由opencv宏參數(shù)指定
    • cv2.FLOODFILL_FIXED_RANGE:改變圖像,填充newvalue
    • cv2.FLOODFILL_MASK_ONLY:不改變?cè)瓐D像,也就是newvalue參數(shù)失去作用,而是改變對(duì)應(yīng)區(qū)域的掩碼,設(shè)為中間八位的值

然后轉(zhuǎn)換成灰度圖

 gray = cv2.cvtColor(blured,cv2.COLOR_BGR2GRAY)  
 cv2.imshow("gray", gray)  

此時(shí)目標(biāo)圖像周圍有寫(xiě)不光滑,還有一些噪聲,因此進(jìn)行開(kāi)閉運(yùn)算,得到比較光滑的目標(biāo)

 #定義結(jié)構(gòu)元素  
 kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(50, 50))
 #開(kāi)閉運(yùn)算,先開(kāi)運(yùn)算去除背景噪聲,再繼續(xù)閉運(yùn)算填充目標(biāo)內(nèi)的孔洞
 opened = cv2.morphologyEx(gray, cv2.MORPH_OPEN, kernel)  
 closed = cv2.morphologyEx(opened, cv2.MORPH_CLOSE, kernel)  
 cv2.imshow("closed", closed) 

接著轉(zhuǎn)換成二值圖以便于獲取圖像的輪廓

最后進(jìn)行輪廓提取,抓取到目標(biāo)

 #找到輪廓
 _,contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)  
 #繪制輪廓
 cv2.drawContours(img,contours,-1,(0,0,255),3)  
 #繪制結(jié)果
 cv2.imshow("result", img)

全部代碼:

#coding=utf-8
import cv2
import numpy as np
 
img = cv2.imread("temp.jpg")                #載入圖像
h, w = img.shape[:2]                        #獲取圖像的高和寬
cv2.imshow("Origin", img)                   #顯示原始圖像
 
blured = cv2.blur(img,(5,5))                #進(jìn)行濾波去掉噪聲
cv2.imshow("Blur", blured)                  #顯示低通濾波后的圖像
 
mask = np.zeros((h+2, w+2), np.uint8)       #掩碼長(zhǎng)和寬都比輸入圖像多兩個(gè)像素點(diǎn),滿水填充不會(huì)超出掩碼的非零邊緣
#進(jìn)行泛洪填充
cv2.floodFill(blured, mask, (w-1,h-1), (255,255,255), (2,2,2),(3,3,3),8)
cv2.imshow("floodfill", blured)
 
#得到灰度圖
gray = cv2.cvtColor(blured,cv2.COLOR_BGR2GRAY)
cv2.imshow("gray", gray)
 
 
#定義結(jié)構(gòu)元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(50, 50))
#開(kāi)閉運(yùn)算,先開(kāi)運(yùn)算去除背景噪聲,再繼續(xù)閉運(yùn)算填充目標(biāo)內(nèi)的孔洞
opened = cv2.morphologyEx(gray, cv2.MORPH_OPEN, kernel)
closed = cv2.morphologyEx(opened, cv2.MORPH_CLOSE, kernel)
cv2.imshow("closed", closed)
 
#求二值圖
ret, binary = cv2.threshold(closed,250,255,cv2.THRESH_BINARY)
cv2.imshow("binary", binary)
 
#找到輪廓
_,contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
#繪制輪廓
 
cv2.drawContours(img,contours,-1,(0,0,255),3)
#繪制結(jié)果
cv2.imshow("result", img)
 
cv2.waitKey(0)
cv2.destroyAllWindows()

總結(jié)

到此這篇關(guān)于如何使用Python OpenCV提取物體輪廓的文章就介紹到這了,更多相關(guān)Python OpenCV提取物體輪廓內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python實(shí)現(xiàn)笑臉檢測(cè)+人臉口罩檢測(cè)功能

    Python實(shí)現(xiàn)笑臉檢測(cè)+人臉口罩檢測(cè)功能

    這篇文章主要介紹了Python實(shí)現(xiàn)笑臉檢測(cè)+人臉口罩檢測(cè),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • 深入理解python協(xié)程

    深入理解python協(xié)程

    協(xié)程又稱為微線程,協(xié)程是一種用戶態(tài)的輕量級(jí)線程,它是實(shí)現(xiàn)多任務(wù)的另一種方式,只不過(guò)是比線程更小的執(zhí)行單元。因?yàn)樗詭PU的上下文,這樣只要在合適的時(shí)機(jī),我們可以把一個(gè)協(xié)程切換到另一個(gè)協(xié)程
    2021-06-06
  • Python xlwings插入Excel圖片的實(shí)現(xiàn)方法

    Python xlwings插入Excel圖片的實(shí)現(xiàn)方法

    這篇文章主要介紹了Python xlwings插入Excel圖片的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Python3.5以上版本lxml導(dǎo)入etree報(bào)錯(cuò)的解決方案

    Python3.5以上版本lxml導(dǎo)入etree報(bào)錯(cuò)的解決方案

    這篇文章主要介紹了Python3.5以上版本lxml導(dǎo)入etree報(bào)錯(cuò)的解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-06-06
  • Python?turtle.right與turtle.setheading的區(qū)別講述

    Python?turtle.right與turtle.setheading的區(qū)別講述

    這篇文章主要介紹了Python?turtle.right與turtle.setheading的區(qū)別,本文以turtle.right為例給大家詳細(xì)介紹,需要的朋友可以參考下
    2022-03-03
  • python tornado微信開(kāi)發(fā)入門代碼

    python tornado微信開(kāi)發(fā)入門代碼

    這篇文章主要為大家詳細(xì)介紹了python tornado微信開(kāi)發(fā)入門代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • 淺析python實(shí)現(xiàn)scrapy定時(shí)執(zhí)行爬蟲(chóng)

    淺析python實(shí)現(xiàn)scrapy定時(shí)執(zhí)行爬蟲(chóng)

    這篇文章主要介紹了淺析python實(shí)現(xiàn)scrapy定時(shí)執(zhí)行爬蟲(chóng)的相關(guān)資料,需要的朋友可以參考下
    2018-03-03
  • 簡(jiǎn)單說(shuō)明Python中的裝飾器的用法

    簡(jiǎn)單說(shuō)明Python中的裝飾器的用法

    這篇文章主要簡(jiǎn)單說(shuō)明了Python中的裝飾器的用法,裝飾器在Python的進(jìn)階學(xué)習(xí)中非常重要,示例代碼基于Python2.x,需要的朋友可以參考下
    2015-04-04
  • Python‘==‘ 及 ‘is‘相關(guān)原理解析

    Python‘==‘ 及 ‘is‘相關(guān)原理解析

    這篇文章主要介紹了Python‘==‘ 及 ‘is‘相關(guān)原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 解決django同步數(shù)據(jù)庫(kù)的時(shí)候app models表沒(méi)有成功創(chuàng)建的問(wèn)題

    解決django同步數(shù)據(jù)庫(kù)的時(shí)候app models表沒(méi)有成功創(chuàng)建的問(wèn)題

    今天小編就為大家分享一篇解決django同步數(shù)據(jù)庫(kù)的時(shí)候app models表沒(méi)有成功創(chuàng)建的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08

最新評(píng)論