十七、輪廓發現

一、輪廓發現原理

輪廓發現是在圖像邊緣提取的基礎上尋找對象輪廓的方法,故邊緣提取的閾值的選定會影響到最終輪廓發現的結果。
其本質是基于二值圖像的,邊緣提取常用Canny進行提取邊緣
輪廓發現也是基于拓撲結構,掃描連通圖,最后建立其樹形結構的拓撲圖
通常情況可以利用梯度來避免閾值的錯誤設定

二、代碼實現

cloneImage,contours,heriachy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
binary:二值圖像
cv2.RETR_TREE:二值圖像返回結果構建模型的方法,即構建輪廓的方法,返回樹形結構
cv2.CHAIN_APPROX_SIMPLE:一般為簡單的返回形式
cloneImage:克隆圖片信息,可忽略
contours:存放返回輪廓信息,最有用
heriachy :存放輪廓層次信息,可忽略

cv2.drawContours(image,contours,i,(0,0,255),2)
image:圖像信息
contours:存放輪廓信息,繪制哪個輪廓,會從contours中找
(0,0,255):繪制輪廓的顏色
2:繪制輪廓的線寬

import cv2
import numpy as np
from matplotlib import pyplot as pltdef contour(image):gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)#先轉換為灰度圖ret,binary = cv2.threshold(gray,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)#二值化cv2.imshow("binary image",binary)cloneImage,contours,heriachy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)for i,contour in enumerate(contours):cv2.drawContours(image,contours,i,(0,0,255),2)print(i)cv2.imshow("detect contours",image)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\calc.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)
contour(src)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果圖如下:在這里插入圖片描述

在這里插入圖片描述

三、加上濾波代碼實現

cv2.GaussianBlur(image,(3,3),0)高斯濾波,卷積核大小為3*3

import cv2
import numpy as np
from matplotlib import pyplot as pltdef contour(image):dst = cv2.GaussianBlur(image,(3,3),0)gray = cv2.cvtColor(dst,cv2.COLOR_BGR2GRAY)#先轉換為灰度圖ret,binary = cv2.threshold(gray,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)#二值化cv2.imshow("binary image",binary)cloneImage,contours,heriachy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)for i,contour in enumerate(contours):cv2.drawContours(image,contours,i,(0,0,255),2)print(i)cv2.imshow("detect contours",image)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\calc.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)
contour(src)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果圖如下:在這里插入圖片描述

在這里插入圖片描述

四、找大輪廓

cv2.findContours(binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cv2.RETR_EXTERNAL:返回最大輪廓結果

import cv2
import numpy as np
from matplotlib import pyplot as pltdef contour(image):dst = cv2.GaussianBlur(image,(3,3),0)gray = cv2.cvtColor(dst,cv2.COLOR_BGR2GRAY)#先轉換為灰度圖ret,binary = cv2.threshold(gray,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)#二值化cv2.imshow("binary image",binary)cloneImage,contours,heriachy = cv2.findContours(binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)for i,contour in enumerate(contours):cv2.drawContours(image,contours,i,(0,0,255),2)print(i)cv2.imshow("detect contours",image)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\calc.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)
contour(src)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果圖如下:在這里插入圖片描述

在這里插入圖片描述

五、填充輪廓

cv2.drawContours(image,contours,i,(0,0,255),-1)
最后一個參數為繪制輪廓線段的寬度,-1表示填充

import cv2
import numpy as np
from matplotlib import pyplot as pltdef contour(image):dst = cv2.GaussianBlur(image,(3,3),0)gray = cv2.cvtColor(dst,cv2.COLOR_BGR2GRAY)#先轉換為灰度圖ret,binary = cv2.threshold(gray,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)#二值化cv2.imshow("binary image",binary)cloneImage,contours,heriachy = cv2.findContours(binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)for i,contour in enumerate(contours):cv2.drawContours(image,contours,i,(0,0,255),-1)print(i)cv2.imshow("detect contours",image)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\calc.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)
contour(src)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果圖如下:
在這里插入圖片描述

六、Canny提取輪廓

import cv2
import numpy as np
from matplotlib import pyplot as pltdef edge(image):blurred = cv2.GaussianBlur(image,(3,3),0)gray = cv2.cvtColor(blurred,cv2.COLOR_BGR2GRAY)xgrad = cv2.Sobel(gray,cv2.CV_16SC1,1,0)#x Gradientygrad = cv2.Sobel(gray,cv2.CV_16SC1,0,1)#y Gradientedge_output = cv2.Canny(gray,50,150)cv2.imshow("Canny Edge",edge_output)return edge_outputdef contour(image):binary = edge(image)cloneImage,contours,heriachy = cv2.findContours(binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)for i,contour in enumerate(contours):cv2.drawContours(image,contours,i,(0,0,255),-1)print(i)cv2.imshow("detect contours",image)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\calc.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)
contour(src)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果圖如下:在這里插入圖片描述

在這里插入圖片描述

七、若尋找輪廓尋找到圖像最外邊緣,取反一下即可

import cv2
import numpy as np
from matplotlib import pyplot as pltdef contour(image):dst = cv2.GaussianBlur(image,(3,3),0)gray = cv2.cvtColor(dst,cv2.COLOR_BGR2GRAY)#先轉換為灰度圖ret,binary = cv2.threshold(gray,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)#二值化cv2.imshow("binary image",binary)cloneImage,contours,heriachy = cv2.findContours(binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)for i,contour in enumerate(contours):cv2.drawContours(image,contours,i,(0,0,255),2)print(i)cv2.imshow("detect contours",image)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\by.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)
contour(src)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果圖如下:在這里插入圖片描述

在這里插入圖片描述

解決方法:cv2.THRESH_BINARY_INV

import cv2
import numpy as np
from matplotlib import pyplot as pltdef contour(image):dst = cv2.GaussianBlur(image,(3,3),0)gray = cv2.cvtColor(dst,cv2.COLOR_BGR2GRAY)#先轉換為灰度圖ret,binary = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU)#二值化cv2.imshow("binary image",binary)cloneImage,contours,heriachy = cv2.findContours(binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)for i,contour in enumerate(contours):cv2.drawContours(image,contours,i,(0,0,255),2)print(i)cv2.imshow("detect contours",image)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\by.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)
contour(src)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果圖如下:在這里插入圖片描述

在這里插入圖片描述

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

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

相關文章

關于 WebRequest.RegisterPrefix

RegisterPrefix 方法將 WebRequest 子代注冊到服務請求。 WebRequest 后代通常被注冊來處理特定的協議(例如 HTTP 或 FTP),但也可能被注冊來處理對特定服務器或服務器上的路徑的請求。 已注冊的預注冊保留類型包括下列類型: htt…

LeetCode 404. 左葉子之和思考分析

題目 計算給定二叉樹的所有左葉子之和。 如果是下面的樹,只有一個左葉子結點4 思考分析 由此我們可以得到左葉子結點的定義: cur->left !NULL && cur->left->leftNULL && cur->left->rightNULL 遞歸遍歷累積操作 …

天王蓋地虎

1&#xff0c;求有序數列中某個元素的個數 思想&#xff1a;二分找上下界&#xff1a; int element_count(int * set, int len, int e) {int f, a, b, t;for(a 0, b len - 1; a < b; set[t a b >> 1] < e ? (a t 1) : (b t - 1));for(f a, b len - 1; a…

ruby array_Ruby中帶有示例的Array.cycle()方法

ruby arrayArray.cycle()方法 (Array.cycle() Method) In this article, we will study about Array.cycle() method. You must be a little more excited to read about Array.cycle method due to its catchy name as I was pretty amazed after reading this method. In the…

十八、對已經找到輪廓的圖像進行測量

圖像輪廓的獲取可參考博文十七 一、相關原理 1&#xff0c;弧長和面積 對于弧長和面積&#xff0c;計算出來的輪廓單位都是像素 2&#xff0c;多邊形擬合 每一個輪廓都是一系列的點&#xff0c;然后通過多邊形進行擬合&#xff0c;無限的接近真實形狀 相關API&#xff1a;…

Linux 終端登錄SSH:解決SSH的Access Denied 和 make xconfig的使用

對于SSH&#xff1a; 可以不是用putty&#xff0c;尤其是putty出現 Access denied 的時候&#xff0c;請換用konsole 或者其他終端 &#xff08;如 terminal&#xff09;在command line中&#xff1a; # ssh 要訪問的主機ip eg &#xff1a; ssh 192.168.111 然后確定…

LeetCode 513. 找樹左下角的值 思考分析

題目 給定一個二叉樹&#xff0c;在樹的最后一行找到最左邊的值。 遞歸解 左下角要滿足兩個條件&#xff1a; 1、深度最大的葉子結點 2、最左結點&#xff1a;使用前序遍歷&#xff0c;優先左邊搜索。 1、確定遞歸函數的參數和返回值 參數&#xff1a;樹的根結點&#xff…

利用MyBatis的動態SQL特性抽象統一SQL查詢接口

1. SQL查詢的統一抽象 MyBatis制動動態SQL的構造,利用動態SQL和自定義的參數Bean抽象,可以將絕大部分SQL查詢抽象為一個統一接口,查詢參數使用一個自定義bean繼承Map,使用映射的方法構造多查詢參數.在遇到多屬性參數(例如order by,其參數包括列名,升序降序類型,以及可以多個列及…

ctype函數_PHP Ctype(字符類型)函數

ctype函數Ctype功能 (Ctype functions) PHP provides some of the built-in functions, which are used to verify the characters in the string i.e. to check whether a string contains the characters of specific types. PHP提供了一些內置函數&#xff0c;這些函數用于驗…

Linux 平臺下 MySQL 5.5 安裝 說明 與 示例

一.下載說明前期的一些準備說明&#xff0c;參考&#xff1a;MySQL 發展史http://blog.csdn.net/tianlesoftware/article/details/6999245Mysql 不同版本 說明http://blog.csdn.net/tianlesoftware/article/details/6723117 MySQL 分為Community Server 和 Enterprise Edition。…

開始python之旅

接觸python緣于工作所需&#xff0c;曾經接觸過C、C等語言&#xff0c;對于編程語言在學習上大體是一個套路&#xff0c;當然套路因人而異&#xff0c;適合就好。接下來&#xff0c;我將不斷分享python的知識和學習技巧&#xff0c;共同學習。 起源 初識一門語言善于先了解語言…

LeetCode 112. 路徑總和 、113. 路徑總和 II 思考分析

目錄112. 路徑總和題目遞歸解遞歸解&#xff0c;其他人的解法迭代解&#xff0c;其他人的解法113. 路徑總和 II題目遞歸解遞歸解&#xff0c;參考別人的思路112. 路徑總和 題目 給定一個二叉樹和一個目標和&#xff0c;判斷該樹中是否存在根節點到葉子節點的路徑&#xff0c;…

kotlin 查找id_Kotlin程序查找矩陣的轉置

kotlin 查找idA transpose of a matrix is simply a flipped version of the original matrix. We can transpose a matrix by switching its rows with its columns 矩陣的轉置只是原始矩陣的翻轉形式。 我們可以通過切換矩陣的行和列來轉置矩陣 Given a matrix, we have to…

[mongodb翻譯]分片和故障轉移

一個配置恰當的mongodb 分片集群不會有單點失效。 本章節描述了集群服務器中可能出現的故障&#xff0c;及相應的對策。 1. 某個mongos路由進程故障 每一個mongos會運行每一臺應用服務器上面&#xff0c;該應用服務器只能通過這個mongos進程和集群進行通信。mongos進程不是…

看張子陽的書真是收獲很多,也醒悟了很多(一)

摘錄&#xff1a; 這是有一次開會時&#xff0c;我的老總跟我們說了這樣一個事例&#xff1a;通常來說&#xff0c;醫生是很高尚的職業&#xff08;暫不考慮國內醫生的負面新聞&#xff09;&#xff0c;尤其是牙科醫生&#xff0c; 他們有著體面的工作并且收入不菲。但是&#…

【C++ grammar】抽象、封裝與this指針

目錄1、Abstraction and Encapsulation&#xff08;抽象與封裝&#xff09;1. Data Field Encapsulation (數據域封裝)2. Accessor and Mutator (訪問器與更改器)2.1. To read/write private data, we need get/set function (為讀寫私有數據&#xff0c;需要get/set函數)2.2. …

java創建臨時文件_用Java創建一個臨時文件

java創建臨時文件The task is to create a temporary file in Java. 任務是用Java創建一個臨時文件。 Creating a temporary file 創建一個臨時文件 To create a temporary file in java – we use createTempFile() method of "File" class. The createTempFile()…

十九、圖像的形態學操作

一、圖像形態學 圖像形態學是圖像處理學科的一個單獨分支學科 主要針對的是灰度圖和二值圖像 是由數學的集合論以及數學中的拓撲幾何原理發展而來 二、膨脹操作&#xff08;dilate&#xff09; 33的卷積核 以33為卷積核從左往右(從上往下)開始運行&#xff0c;若這卷積核…

X名稱空間(WPF)

筆記簡述 閑話x名稱空間簡要x名稱空間的Attributex名稱空間的標簽擴展x名稱空間的XAML指令元素閑話 本筆記參考與《深入淺出WPF》、MSDN、Some Blog… MSDN的飛機票點這里。 x名稱空間簡要 在VS中新建個WpfApplication都會自動生成xmlns:x"http://schemas.microsoft.com/w…

基于Bresenham和DDA算法畫線段

直線&#xff1a;ykxb 為了將他在顯示屏上顯示出來&#xff0c;我們需要為相應的點賦值&#xff0c;那么考慮到計算機的乘法執行效率&#xff0c;我們肯定不會選擇用Ykxb這個表達式求值&#xff0c;然后進行畫線段。 我們應當是將它轉化為加法運算。 下面提供兩種常見的算法&am…