15-輪廓檢測

邊緣是零零散散的,而輪廓是一個整體
cv2.findContours(img,mode,method)
img:輸入圖像對象名稱
mode:輪廓檢索模式

RETR_EXTERNAL:只檢索最外面的輪廓
RETR_LIST:檢索所有的輪廓,并將其保存到一條鏈表當中
RETR_CCOMP:檢索所有的輪廓,并將他們組織為兩層;頂層是各部分的外部邊界,第二層為空洞的邊界
RETR_TREE:檢索所有的輪廓,并重構嵌套輪廓的整個層次(最常用)

method:輪廓逼近方法

CHAIN_APPROX_NONE:以Freeman鏈碼的方式輸出輪廓,所有其他方法輸出多邊形(頂點的序列)
CHAIN_APPROX_SIMPLE:壓縮水平的、垂直的和斜的部分,也就是,函數只保留他們的終點部分

為了更高的精確率,盡量最好使用二值圖像

import cv2
import numpy as np
from matplotlib import pyplot as pltdef show_photo(name,picture):#圖像顯示函數cv2.imshow(name,picture)cv2.waitKey(0)cv2.destroyAllWindows()#做之前需要對照片進行二值處理
img = cv2.imread('E:\Jupyter_workspace\study\data/cfx.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#轉換為灰度圖
ret, thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)#對圖像進行二值處理,小于127為0,大于127為255
show_photo('thresh',thresh)binary, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)show_photo('binary',binary)#就是作完二值操作的結果np.array(contours).shape#是一群list結構的輪廓點,保存一些輪廓的信息
#結果為:(2,)#hierarchy是一個層級,把結果全部保存到層級里面

二值處理后的圖像
在這里插入圖片描述
binary參數實則就是二值處理后的圖像
在這里插入圖片描述

繪制輪廓

cv2.drawContours(draw_img,contours,-1,(0,0,255),2)

參數1:一個照片對象名稱
參數2:輪廓是什么
參數3:畫第幾個輪廓,-1表示把所有的輪廓都畫出來
參數4:(B,G,R)畫輪廓的線是什么顏色的
參數5:線條的寬度
import cv2
import numpy as np
from matplotlib import pyplot as pltdef show_photo(name,picture):#圖像顯示函數cv2.imshow(name,picture)cv2.waitKey(0)cv2.destroyAllWindows()#做之前需要對照片進行二值處理
img = cv2.imread('E:\Jupyter_workspace\study\data/cfx.png')
show_photo('img ',img )gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#轉換為灰度圖
ret, thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)#對圖像進行二值處理,小于127為0,大于127為255
binary, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)draw_img = img.copy()#注意一定要copy要不然會對原圖進行改變!!!
res = cv2.drawContours(draw_img,contours,-1,(0,0,255),2)#-1表示顯示所有輪廓,(0,0,225)BGR表示紅色,2為輪廓粗細
show_photo('-1 is All',res)draw_img = img.copy()#注意一定要copy要不然會對原圖進行改變!!!
res = cv2.drawContours(draw_img,contours,0,(0,0,255),2)#0表示顯示第0個輪廓,(0,0,225)BGR表示紅色,2為輪廓粗
show_photo('zero',res)draw_img = img.copy()#注意一定要copy要不然會對原圖進行改變!!!
res = cv2.drawContours(draw_img,contours,1,(0,0,255),2)#1表示顯示第1個輪廓,(0,0,225)BGR表示紅色,2為輪廓粗
show_photo('one',res)

原圖:
在這里插入圖片描述
顯示所有輪廓(里外)
在這里插入圖片描述
顯示第0個輪廓(外)
在這里插入圖片描述
顯示第1個輪廓(內)
在這里插入圖片描述

輪廓特征

import cv2
import numpy as np
from matplotlib import pyplot as pltdef show_photo(name,picture):#圖像顯示函數cv2.imshow(name,picture)cv2.waitKey(0)cv2.destroyAllWindows()img = cv2.imread('E:\Jupyter_workspace\study\data/cfx.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#轉換為灰度圖
ret, thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)#對圖像進行二值處理,小于127為0,大于127為255
binary, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)cnt = contours[0]#contours存放所有輪廓的信息,這里取第一個輪廓cv2.contourArea(cnt)#第一個輪廓所對應的面積
#結果為:20909.0cv2.arcLength(cnt,True)#第一個輪廓所對應的周長,True表示閉合的
#結果為:612.0

輪廓近似

輪廓近似:舉例子拿曲線AB進行近似計算

1,首先直線連接AB,再曲線AB上找到離AB直線最遠的一點C,點C到直線AB的距離為d1
2,用戶需要自定義一個值epsilon作為閾值
3,將d1與閾值epsilon進行比較;若d1 < epsilon可直接將直線AB代替曲線AB,近似結束若d1 > epsilon則,連接直線AC和直接BC在曲線AC上找離直線AC最短的一點D,點D到直線AC的距離為d2若d2 < epsilon可直接將直線AC代替曲線AC若d2 > epsilon則做同樣的操作在曲線BC上找離直線BC最短的一點E,點E到直線BC的距離為d3同樣的操作

在這里插入圖片描述

import cv2
import numpy as np
from matplotlib import pyplot as pltdef show_photo(name,picture):#圖像顯示函數cv2.imshow(name,picture)cv2.waitKey(0)cv2.destroyAllWindows()img = cv2.imread('E:\Jupyter_workspace\study\data/lunkuo.png')
show_photo('img ',img )gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
binary, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)cnt = contours[0]draw_img = img.copy()
res =cv2.drawContours(draw_img,[cnt],-1,(0,0,255),2)
show_photo('res',res)

原圖:
在這里插入圖片描述
輪廓近似后效果
在這里插入圖片描述

近似函數:

cv2.approxPolyDP(cnt,epsilon,True)

參數1:傳入要近似的輪廓
參數2:自定義一個值來進行輪廓比較,一般是按周長的百分比進行設置的
參數3:輪廓是否封閉
import cv2
import numpy as np
from matplotlib import pyplot as pltdef show_photo(name,picture):#圖像顯示函數cv2.imshow(name,picture)cv2.waitKey(0)cv2.destroyAllWindows()img = cv2.imread('E:\Jupyter_workspace\study\data/lunkuo.png')
show_photo('img ',img )gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
binary, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)epsilon = 0.1*cv2.arcLength(cnt,True)#倍數越小越接近本身輪廓
approx = cv2.approxPolyDP(cnt,epsilon,True)draw_img = img.copy()
res =cv2.drawContours(draw_img,[approx],-1,(0,0,255),2)
show_photo('res',res)

原圖:
在這里插入圖片描述
近似函數處理過后的圖像:
在這里插入圖片描述

邊界矩形

獲得輪廓的邊緣矩形:cv2.boundingRect(cnt)

參數:指定操作的對象是哪個輪廓
返回值:輪廓對應的邊緣矩形的x,y坐標和w,h寬高值
import cv2
import numpy as np
from matplotlib import pyplot as pltdef show_photo(name,picture):#圖像顯示函數cv2.imshow(name,picture)cv2.waitKey(0)cv2.destroyAllWindows()img = cv2.imread('E:\Jupyter_workspace\study\data/lunkuo1.png')
show_photo('img',img)#原圖gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
res, thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
binary, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
cnt = contours[0]#這里的輪廓取得是第0個,當然也可以取其他的輪廓x, y, w, h = cv2.boundingRect(cnt)
img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
show_photo('img',img)area = cv2.contourArea(cnt)#輪廓面積
x, y, w, h = cv2.boundingRect(cnt)
rect_area = w * h #輪廓對應的邊緣矩形的面積,寬×高為對應邊緣矩形的面積
extent = float(area) / rect_area
print('輪廓面積與邊界矩形之比',extent)
#結果為:輪廓面積與邊界矩形之比 0.5113636363636364

原圖:
在這里插入圖片描述
獲取第0個輪廓邊界矩形:
在這里插入圖片描述

外接圓

import cv2
import numpy as np
from matplotlib import pyplot as pltdef show_photo(name,picture):#圖像顯示函數cv2.imshow(name,picture)cv2.waitKey(0)cv2.destroyAllWindows()img = cv2.imread('E:\Jupyter_workspace\study\data/lunkuo1.png')
show_photo('img',img)gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
res, thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
binary, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
cnt = contours[0]#對輪廓0操作,當然也可以換成其他的輪廓x, y, w, h = cv2.boundingRect(cnt)
(x,y),radius = cv2.minEnclosingCircle(cnt)
center = (int(x),int(y))
radius = int(radius)
img = cv2.circle(img,center,radius,(0,255,0),2)#(B,G,R),2為輪廓粗細程度
show_photo('img',img)

原圖:
在這里插入圖片描述
對第0輪廓進行外接圓操作:
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378705.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378705.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378705.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

拋硬幣仿真實驗java_探索HyperLogLog算法(含Java實現)

引言HyperLogLog算法經常在數據庫中被用來統計某一字段的Distinct Value(下文簡稱DV)&#xff0c;比如Redis的HyperLogLog結構&#xff0c;出于好奇探索了一下這個算法的原理&#xff0c;無奈中文資料很少&#xff0c;只能直接去閱讀論文以及一些英文資料&#xff0c;總結成此文…

kotlin鍵值對數組_Kotlin程序以升序對數組進行排序

kotlin鍵值對數組Given an array, we have to sort its elements in ascending order. 給定一個數組&#xff0c;我們必須按升序對其元素進行排序。 Example: 例&#xff1a; Input:arr [10, 20, 5, 2, 30]Output:sorted array (Ascending Order): [2, 5, 10, 20, 30]在Kotl…

微機原理——總線和時序

前提 8088有兩個組態&#xff1a; 最大組態和最小組態&#xff0c;通過引腳MN/MX*的電平決定組態。&#xff08;*表示低電平有效&#xff09; 兩種組態沒有本質區別。 8088的引腳&#xff1a; 引腳可分為下面幾種類別&#xff1a; 1、數據和地址引腳 2、讀寫控制引腳 3、中斷…

PHP站內搜索:多關鍵字查找,加亮顯示

1、SQL語句中的模糊查找LIKE條件一般用在指定搜索某字段的時候, 通過"% _" 通配符的作用實現模糊查找功能&#xff0c;通配符可以在前面也可以在后面或前后都有。搜索以PHP100開頭&#xff1a; SELECT * FROM teble WHERE title LIKE PHP100% 搜索以PHP100結束&…

16-模板匹配

cv2.matchTemplate(img,template,cv2.TM_SQDIFF) 參數一&#xff1a;原圖圖像對象名稱 參數二&#xff1a;模板圖像對象名稱 參數三&#xff1a;差別程度的計算方法(六選一推薦使用帶歸一化的) 模板匹配和卷積原理很像&#xff0c;模板從原圖像上從原點開始滑動&#xff0c;計…

對MySQL性能影響關系緊密的五大配置參數

以下的文章主要是對MySQL性能影響關系緊密的五大配置參數的介紹&#xff0c;我前幾天在相關網站看見對MySQL性能影響關系緊密的五大配置參數的資料&#xff0c;覺得挺好&#xff0c;就拿出來供大家分享&#xff0c;望你能有所收獲。(一)連接 連接通常來自Web服務器&#xff0c;…

JAVA安裝作用_jdk安裝配置及其作用

2.安裝好了就是去配置路徑了&#xff0c;我的是win7系統&#xff0c;步驟如下&#xff1a;桌面上的計算機右擊-》高級系統設置—》環境變量-》系統變量-》新建一共要新建三個變量JAVA_HOME,PATH和CLASSPATH1>JAVA_HOME:(這么寫為了方便以后可能改動jdk的安裝路徑&#xff0c…

用C#開發Windows應用程序

To develop windows application, we need to using studio and follow some steps: 要開發Windows應用程序 &#xff0c;我們需要使用studio并遵循一些步驟&#xff1a; Step 1) First of all we launch visual studio. 步驟1)首先&#xff0c;我們啟動Visual Studio。 Ste…

圖像分割——基于二維灰度直方圖的閾值處理

前言 像素灰度值僅僅反映了像素灰度級的幅值大小&#xff0c;并沒有反映出像素與鄰域的空間相關信息。 二維灰度直方圖的概念 二維灰度直方圖&#xff1a;像素的灰度值分布和鄰域的平均灰度值分布構成的二維直方圖 二維直方圖的值N(i,j) 。其中&#xff0c;if(x,y) 圖像(x,y…

多維角度聊聊結對編程

在敏捷軟件開發的各種實踐中&#xff0c;結對編程&#xff08;Pair Programming&#xff0c;下文簡稱Pair&#xff09;是特別有爭議的。Pair有一個特點&#xff0c;那就是還沒有進行過任何Pair實踐前&#xff0c;你很可能對它已經有了“喜歡” 或者是“討厭”的印象。如果有人問…

17-直方圖

直方圖 何為直方圖&#xff1f;沒那么高大上&#xff0c;其實就是二維統計圖。每個照片都是有像素點所組成&#xff0c;當然也是[0,255]&#xff0c;直方圖就是統計每個值所對應的像素點有幾個。 直方圖橫坐標表示0-255這些像素點值&#xff1b;縱坐標表示對應像素點值的個數有…

java求水電費_java水電費管理系統

每天記錄學習&#xff0c;每天會有好心情。*^_^*今天和一個朋友共同完成了一個基于web的java水電費管理系統項目&#xff0c;我們在開發時選用的框架是SSM(MYECLIPSE)框架。我這個朋友知識有限&#xff0c;只會這個框架&#xff0c;哈哈&#xff0c;都是為了方便他。和往常一樣…

zemax微透鏡陣列示例_陣列反向! Ruby中的示例方法

zemax微透鏡陣列示例陣列反向&#xff01; 方法 (Array reverse! Method) In this article, we will study about Array.reverse! method. You all must be thinking the method must be doing something related to reversing certain elements as we have done in the case o…

Opencv實戰【1】人臉檢測并對ROI區域進行部分處理(變身喬碧蘿!!!)

步驟&#xff1a; 1、利用Opencv自帶的分類器檢測人臉 預備知識&#xff1a;Haar特征分類器 Haar特征分類器就是一個XML文件&#xff0c;該文件中會描述人體各個部位的Haar特征值。包括人臉、眼睛、嘴唇等等。 Haar特征分類器存放地址&#xff1a; &#xff08;找自己的安裝…

【黑馬甄選離線數倉day10_會員主題域開發_DWS和ADS層】

day10_會員主題域開發 會員主題_DWS和ADS層 DWS層開發 門店會員分類天表: 維度指標: 指標&#xff1a;新增注冊會員數、累計注冊會員數、新增消費會員數、累計消費會員數、新增復購會員數、累計復購會員數、活躍會員數、沉睡會員數、會員消費金額 維度: 時間維度&#xff08…

iPad和iPhone的app圖標尺寸、用途、設置方法

下面是在iPhone專用程序、iPad專用程序和通用程序中使用圖標文件的指導&#xff0c;由譯言網翻譯自蘋果官方文檔。原文 http://article.yeeyan.org/view/395/100567 注意&#xff1a;圖標是你的程序包所必需的組成部分。如果你沒有提供程 序所需的各種尺寸的圖標&#xff0c;系…

18-傅里葉變化

以時間為參照就是時域分析&#xff0c;當然時間是動態變化的 而傅里葉變換是以頻域為基準的&#xff0c;不用關心動態變化&#xff0c;只關心做了多少次而已&#xff0c;次數&#xff0c;頻率 傅里葉說過&#xff0c;任何一個周期函數都可以用正弦函數堆疊起來形成。強吧&#…

java中訪問修飾符_Java中的非訪問修飾符是什么?

java中訪問修飾符Java非訪問修飾符 (Java non access modifiers) We have 7 non-access modifiers in Java. The name of these non-access modifiers are given below, Java中有7個非訪問修飾符 。 這些非訪問修飾符的名稱如下所示&#xff1a; native 本機 synchronized 已同…

mui實現分享功能_MUI 分享功能(微信、QQ 、朋友圈)

配置文件&#xff1a;manifest.jsonplus ->plugins 下邊"share": {/*配置應用使用分享功能&#xff0c;參考http://ask.dcloud.net.cn/article/27*/"qq": {"appid": "",/*騰訊QQ開放平臺申請應用的AppID值*/"description"…

Java 注解學習筆記

轉自&#xff1a;http://wanqiufeng.blog.51cto.com/409430/458883 一、什么是java注解 注解&#xff0c;顧名思義&#xff0c;注解,就是對某一事物進行添加注釋說明&#xff0c;會存放一些信息&#xff0c;這些信息可能對以后某個時段來說是很有用處的。 Java注解又叫java標注…