OpenCV圖像輪廓的繪制方法
本文實(shí)例為大家分享了檢測(cè)幾何圖形輪廓和檢測(cè)花朵圖形輪廓,供大家參考,具體內(nèi)容如下
OpenCV繪制圖像輪廓
繪制輪廓的一般步驟:
1、讀取圖像
image = cv2.imread('image_path')
2、將原圖轉(zhuǎn)化為灰度圖像
image_gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
3、將灰度圖像進(jìn)行二值化閾值處理
# 這里將閾值設(shè)置為127為例,最大閾值為255 t, binary = cv.threshold(image_gray, 127, 255, cv.THRESH_BINARY)
4、檢測(cè)二值化圖像中邊緣輪廓
# 這里以檢測(cè)所有輪廓,不建立層次關(guān)系為例 contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
5、在原圖上繪制圖像
# 這里將輪廓索引設(shè)置為-1,繪制出所有輪廓,顏色設(shè)置為紅色,寬度為2為例 cv2.drawContours(image, contours, -1, (0, 0, 255), 2)
6、顯示圖像
cv2.imshow('image', image)
測(cè)試檢測(cè)幾何圖形輪廓:
代碼如下:
# -*- coding: utf-8 -*-
# @Time : 2021/8/17
# @Author : ZYh
"""
Introduction:
圖像輪廓檢測(cè):
OpenCV提供的findContours()方法可以通過(guò)計(jì)算圖像梯度來(lái)判斷出圖像的邊緣,然后將邊緣的點(diǎn)封裝成數(shù)組返回
contours, hierarchy = cv2.findContours(image, mode, mothode)
參數(shù):
image->被檢測(cè)圖像必須是8位單通道二值圖像。如果原圖是rgb圖像,必須轉(zhuǎn)為灰度圖像,在進(jìn)行二值化閾值處理
mode->輪廓的檢索模式
參數(shù)值 含義
cv2.RETR_EXTERNAL 只檢測(cè)外輪廓
cv2.RETR_LIST 檢測(cè)所有輪廓,但不建立層次關(guān)系
cv2.RETR_CCOMP 檢測(cè)所有輪廓,并建立兩級(jí)層次關(guān)系
cv2.RETR_TREE 檢測(cè)所有輪廓,并建立樹(shù)狀結(jié)構(gòu)的層次關(guān)系
mothode->檢測(cè)輪廓時(shí)使用的方法
參數(shù)值 含義
cv2.CHAIN_NONE 儲(chǔ)存輪廓上的所有點(diǎn)
cv2.CHAIN_APPROX_SIMPLE 只保存水平、垂直或?qū)蔷€輪廓的端點(diǎn)
cv2.CHAIN_APPROX_TC89_L1 Ten_Chinl近似算法的一種
cv2.CHAIN_APPROX_TC89_KCOS Ten_Chinl近似算法的一種
retval:
contours->檢測(cè)出的所有輪廓,list類(lèi)型,每一個(gè)元素都是某個(gè)輪廓的像素坐標(biāo)數(shù)組
hierarchy->輪廓之間的層次關(guān)系
圖像輪廓繪制:
image = cv2.drawContours(image, contours, contourIdx, color, thickness, lineTypee, hierarchy,
maxLevel, offse)
參數(shù):
image->被繪制輪廓的原始圖像,可以是多通道圖像
contours->findContours()方法得出的輪廓列表
contourIdx->繪制輪廓的索引,如果為-1則繪制所有輪廓
color:繪制顏色,BGR格式
thickness->可選參數(shù),畫(huà)筆的粗細(xì),如果為-1則繪制實(shí)心輪廓
lineTypee->可選參數(shù),繪制輪廓的線型
hierarchy->可選參數(shù),findContours()方法得出的層次關(guān)系
maxLevel->可選參數(shù),繪制輪廓的層次深度,最深繪制第maxLevel層
offse->可選參數(shù),偏移量,可以改變繪制結(jié)果的位置
"""
import cv2 as cv
# 讀取加載圖像
image1 = cv.imread('shape1.png')
image2 = cv.imread('shape1.png')
# 將圖像由RGB格式轉(zhuǎn)為灰度圖像
gray1 = cv.cvtColor(image1, cv.COLOR_BGR2GRAY)
gray2 = cv.cvtColor(image2, cv.COLOR_BGR2GRAY)
# 將圖像進(jìn)行二值化閾值處理, 返回t是處理時(shí)采用的閾值,binary是閾值處理后的圖像
t1, binary1 = cv.threshold(gray1, 127, 255, cv.THRESH_BINARY)
t2, binary2 = cv.threshold(gray2, 127, 255, cv.THRESH_BINARY)
# 檢測(cè)圖像中出現(xiàn)的所有輪廓,記錄輪廓的每一個(gè)點(diǎn)
contours1, hierarchy1 = cv.findContours(binary1, cv.RETR_LIST, cv.CHAIN_APPROX_NONE)
# 顯示原圖
cv.imshow('image', image1)
# 繪制所有輪廓,寬度為3,顏色為紅色
cv.drawContours(image1, contours1, -1, (0, 0, 255), 3)
cv.imshow('cv.RETR_LIST', image1)
# 檢測(cè)圖像中的外輪廓,記錄輪廓的每一個(gè)點(diǎn)
contours2, hierarchy2 = cv.findContours(binary2, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)
# 使用cv2.RETR_EXTERNAL做參數(shù)繪制外輪廓,寬度為3,顏色為藍(lán)色
cv.drawContours(image2, contours2, -1, (255, 0, 0), 3)
cv.imshow('cv.RETR_EXTERNAL', image2)
cv.waitKey()
cv.destroyAllWindows()
運(yùn)行結(jié)果:

測(cè)試檢測(cè)花朵圖形輪廓:
代碼如下:
# -*- coding: utf-8 -*-
# @Time : 2021/8/18
# @Author : ZYh
"""
Introduction:
繪制花朵所有輪廓
"""
import cv2 as cv
image_flower = cv.imread('flower.png')
# 顯示原圖
cv.imshow('flower1', image_flower)
# 對(duì)圖像進(jìn)行中值濾波處理,去除噪聲
image_flower = cv.medianBlur(image_flower, 5)
cv.imshow('flower2', image_flower)
# 將圖像從RGB轉(zhuǎn)為單通道灰度圖像
gray_flower = cv.cvtColor(image_flower, cv.COLOR_BGR2GRAY)
# 灰度圖像進(jìn)行二值化閾值處理
t, binary = cv.threshold(gray_flower, 127, 255, cv.THRESH_BINARY)
# 顯示二值化圖像
cv.imshow('binary', binary)
# 獲取二值化圖像中的輪廓以及輪廓層次
contours, hierarchy = cv.findContours(binary, cv.RETR_LIST, cv.CHAIN_APPROX_NONE)
# 在原圖中繪制輪廓
cv.drawContours(image_flower, contours, -1, (0, 255, 255), 2)
# 顯示繪制輪廓后的圖像
cv.imshow('cv.RETR_LIST', image_flower)
cv.waitKey()
cv.destroyAllWindows()
運(yùn)行結(jié)果:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
windows7 32、64位下python爬蟲(chóng)框架scrapy環(huán)境的搭建方法
這篇文章主要介紹了windows7 32、64位下python爬蟲(chóng)框架scrapy環(huán)境的搭建方法,需要的朋友可以參考下2018-11-11
OpenCV+Python識(shí)別車(chē)牌和字符分割的實(shí)現(xiàn)
這篇文章主要介紹了OpenCV+Python識(shí)別車(chē)牌和字符分割的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
利用Python實(shí)現(xiàn)最小二乘法與梯度下降算法
這篇文章主要介紹了利用Python實(shí)現(xiàn)最小二乘法與梯度下降算法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
Django利用Cookie實(shí)現(xiàn)反爬蟲(chóng)的例子
這篇文章主要介紹了Django利用Cookie實(shí)現(xiàn)反爬蟲(chóng),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
Pandas.DataFrame行和列的轉(zhuǎn)置的實(shí)現(xiàn)
本文主要介紹了Pandas.DataFrame行和列的轉(zhuǎn)置的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
python中把嵌套的列表合并成一個(gè)列表方法總結(jié)
python中l(wèi)ist這種數(shù)據(jù)結(jié)構(gòu)很常用到,下面這篇文章主要給大家介紹了關(guān)于python中把嵌套的列表合并成一個(gè)列表方法的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11
python實(shí)戰(zhàn)串口助手_解決8串口多個(gè)發(fā)送的問(wèn)題
今天小編就為大家分享一篇python實(shí)戰(zhàn)串口助手_解決8串口多個(gè)發(fā)送的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06
Python實(shí)現(xiàn)將字典(列表按列)存入csv文件
這篇文章主要介紹了Python實(shí)現(xiàn)將字典(列表按列)存入csv文件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
Python數(shù)據(jù)分析:pandas中Dataframe的groupby與索引用法
這篇文章主要介紹了pandas中Dataframe的groupby與索引用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02

