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

Python基于opencv的簡(jiǎn)單圖像輪廓形狀識(shí)別(全網(wǎng)最簡(jiǎn)單最少代碼)

 更新時(shí)間:2021年01月28日 11:48:07   作者:猴猴猴子  
這篇文章主要介紹了基于opencv的簡(jiǎn)單圖像輪廓形狀識(shí)別(全網(wǎng)最簡(jiǎn)單最少代碼),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

可以直接跳到最后整體代碼看一看是不是很少的代碼?。。?!

思路:
1. 數(shù)據(jù)的整合
2. 圖片的灰度轉(zhuǎn)化
3. 圖片的二值轉(zhuǎn)化
4. 圖片的輪廓識(shí)別
5. 得到圖片的頂點(diǎn)數(shù)
6. 依據(jù)頂點(diǎn)數(shù)判斷圖像形狀

一、原數(shù)據(jù)的展示

在這里插入圖片描述

圖片文件共36個(gè)文件夾,每個(gè)文件夾有100張圖片,共3600張圖片。

在這里插入圖片描述

每一個(gè)文件夾里都有形同此類(lèi)的圖形

二、數(shù)據(jù)的整合

對(duì)于多個(gè)文件夾,分析起來(lái)很不方便,所有決定將其都放在一個(gè)文件夾下進(jìn)行分析,在python中具體實(shí)現(xiàn)如下:
本次需要的包

import cv2
import os
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
a=os.listdir('C:\\Users\\dell\\Desktop\\OpenCVProofSet')#循環(huán)讀取每個(gè)子文件夾
for i in range(len(a)):
 	b=os.listdir('C:\\Users\\dell\\Desktop\\OpenCVProofSet\\'+a[i])#讀取每個(gè)子文件下的圖片文件
 for j in range(len(b)):
  c=Image.open('C:\\Users\\dell\\Desktop\\OpenCVProofSet\\'+a[i]+'\\'+b[j])#循環(huán)讀取每個(gè)圖片文件
  c.save('C:\\Users\\dell\\Desktop\\cleardata\\'+str(i)+'_'+str(j)+'.png')#以文件夾序號(hào)和圖片序號(hào)為名保存在一個(gè)興建文件夾下

結(jié)果如下:

在這里插入圖片描述

三、圖片輪廓的確定

3.1圖片的灰度處理

以下以一張圖片為例子作為說(shuō)明
對(duì)于灰度的處理,選擇使用opencv的cv2.cvtColor函數(shù),代碼示例如下:

d=os.listdir('C:\\Users\\dell\\Desktop\\cleardata\\')#文件路徑
e=cv2.imread('C:\\Users\\dell\\Desktop\\cleardata\\'+d[5])#以矩陣的形式圖片讀入
plt.imshow(e)#畫(huà)出示例圖

在這里插入圖片描述
進(jìn)行灰度的轉(zhuǎn)化:

g=cv2.cvtColor(e,cv2.COLOR_BGR2GRAY)##灰度轉(zhuǎn)化

3.2圖片的二值轉(zhuǎn)化

對(duì)于圖片的二值轉(zhuǎn)化這里選用cv2.threshold函數(shù),代碼示例如下:

r,b=cv2.threshold(g,0,255,cv2.THRESH_OTSU)#二值轉(zhuǎn)化,大于0的像素統(tǒng)一設(shè)置為255,小于等于0的統(tǒng)一設(shè)置為0

上述代碼的第一個(gè)參數(shù)為灰度圖形,第二個(gè)參數(shù)是閾值,即大于0的像素點(diǎn)轉(zhuǎn)化為255,然后選用的THRESH_OTSU方法,具體說(shuō)明如下:
通常情況,我們一般不知道設(shè)定怎樣的閾值thresh才能得到比較好的二值化效果,只能去試。如對(duì)于一幅雙峰圖像(理解為圖像直方圖中存在兩個(gè)峰),我們指定的閾值應(yīng)盡量在兩個(gè)峰之間的峰谷。這時(shí),就可以用第四個(gè)參數(shù)THRESH_OTSU,它對(duì)一幅雙峰圖像自動(dòng)根據(jù)其直方圖計(jì)算出合適的閾值(對(duì)于非雙峰圖,這種方法得到的結(jié)果可能不理想)。
對(duì)于雙峰圖,我們需要多傳入一個(gè)參數(shù)cv2.THRESH_OTSU,并且把閾值thresh設(shè)為0,算法會(huì)找到最優(yōu)閾值,并作為第一個(gè)返回值ret返回。

其中會(huì)返回兩個(gè)值,第二個(gè)值就是二值化后的圖形矩陣。

3.3輪廓的尋找

在輪廓的尋找方面,采用cv2.findContours方式。代碼示例如下:

cr,t=cv2.findContours(b, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)##找到邊界,第一個(gè)參數(shù)是二值圖像,第二個(gè)參數(shù)是獲取輪廓的方式,
#第三個(gè)參數(shù)定義輪廓的近似方式

上述函數(shù)里的參數(shù)中,第一個(gè)參數(shù)是二值化后的矩陣,第二個(gè)參數(shù)是獲取輪廓的方式,第三個(gè)參數(shù)是定義輪廓的近似方式。后面兩個(gè)參數(shù)的具體解釋如下:

在這里插入圖片描述

上面得到的結(jié)果中第一個(gè)結(jié)果是輪廓點(diǎn)的集合。

畫(huà)出邊界輪廓,運(yùn)用函數(shù)是cv2.drawContours,代碼示例如下:

plt.imshow(cv2.drawContours(e,cr,-1,50))#畫(huà)出邊界,可以看出有坐標(biāo)軸和五角星兩個(gè)邊界,第一個(gè)參數(shù)是原圖,第二個(gè)參數(shù)是邊界,
#第三個(gè)參數(shù)代表畫(huà)出所有邊界,第四個(gè)參數(shù)是線的粗細(xì)

上述函數(shù)中第一個(gè)參數(shù)是原始圖形,第二個(gè)參數(shù)是得到的輪廓點(diǎn)的集合,第三個(gè)參數(shù)是代表畫(huà)出所有輪廓點(diǎn),第四個(gè)參數(shù)是線的粗細(xì)。

得到結(jié)果如下:

在這里插入圖片描述

可以發(fā)現(xiàn),坐標(biāo)軸的輪廓和五角星的輪廓都被畫(huà)了出來(lái)。

3.4輪廓的逼近,得到頂點(diǎn)

在得到輪廓點(diǎn)后,需要得到輪廓的頂點(diǎn),通過(guò)頂點(diǎn)得到具體什么圖形,在輪廓逼近中用到兩個(gè)函數(shù):cv2.arcLength,cv2.approxPolyDP,代碼示例如下:

ep = 0.01*cv2.arcLength(cr[1], True)#五角星輪廓的周長(zhǎng)cr[0]是坐標(biāo)軸的周長(zhǎng),然后將其縮小,作為下一步的閾值
ap = cv2.approxPolyDP(cr[1], ep, True)#輪廓的轉(zhuǎn)折點(diǎn)的近似點(diǎn)

cv2.arcLength得到的是輪廓點(diǎn)形成的曲線圍成的圖形的周長(zhǎng),cr[1]代表里層五角星的輪廓點(diǎn),因?yàn)閏r里有兩個(gè)輪廓集合,一個(gè)是外層的坐標(biāo)軸的輪廓點(diǎn)集合,一個(gè)是里層五角星的輪廓點(diǎn)集合。True代表閉合的曲線。將其取1%作為下一個(gè)函數(shù)的閾值。

cv2.approxPolyDP將其得到的輪廓點(diǎn)進(jìn)行篩選(按設(shè)定的閾值與其真實(shí)的線進(jìn)行比較),其篩選的標(biāo)準(zhǔn)就是上一個(gè)函數(shù)得到的1%的周長(zhǎng),大于這個(gè)值的點(diǎn)舍去,小于這個(gè)值的點(diǎn)保留,True依然代表閉合曲線。

在這里插入圖片描述

通過(guò)以上的步驟就可以保留一些點(diǎn),而這些點(diǎn)就是得到頂點(diǎn)(這點(diǎn)需要讀者去想一想,為什么以1%周長(zhǎng)為閾值得到的點(diǎn)就是頂點(diǎn),作者認(rèn)為是兩條線的拐點(diǎn)相對(duì)于來(lái)說(shuō)是里真實(shí)線最近的點(diǎn))
頂點(diǎn)數(shù):

len(ap)#可以看見(jiàn)五角星有10個(gè)點(diǎn)

在這里插入圖片描述

四、依據(jù)頂點(diǎn)判斷形狀

根據(jù)得到的定點(diǎn)數(shù)就可判斷出形狀了,三個(gè)頂點(diǎn)就是三角形,四個(gè)就是矩形,十個(gè)就是五角星,十個(gè)以上就是圓形了;上述的完整代碼如下:

import cv2
import os
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
d=os.listdir('C:\\Users\\dell\\Desktop\\cleardata\\')
for i in range(len(d)):
 e=cv2.imread('C:\\Users\\dell\\Desktop\\cleardata\\'+d[i])
 g=cv2.cvtColor(e,cv2.COLOR_BGR2GRAY)
 r,b=cv2.threshold(g,0,255,cv2.THRESH_OTSU)
 cr,t=cv2.findContours(b, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
 ep = 0.01*cv2.arcLength(cr[1], True)
 ap = cv2.approxPolyDP(cr[1], ep, True)
 co=len(ap)
 if co==3:
  st='三角形'
 elif co==4:
  st='矩形'
 elif co==10:
  st='五角星'
 else:
  st='圓'  
 plt.imsave('C:\\Users\\dell\\Desktop\\形狀\\'+st+str(e[100][100])+str(i)+'.jpg',e)#取圖像中間的點(diǎn)的RGB作為顏色代表

這里我還取了圖形的中點(diǎn),希望得到圖片的顏色,其得到的是RGB值,通過(guò)RGB值就可以得到顏色。
最終結(jié)果如下:

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

到此這篇關(guān)于基于opencv的簡(jiǎn)單圖像輪廓形狀識(shí)別(全網(wǎng)最簡(jiǎn)單最少代碼)的文章就介紹到這了,更多相關(guān)opencv 圖像輪廓形狀識(shí)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python使用Tkinter顯示網(wǎng)絡(luò)圖片的方法

    python使用Tkinter顯示網(wǎng)絡(luò)圖片的方法

    這篇文章主要介紹了python使用Tkinter顯示網(wǎng)絡(luò)圖片的方法,涉及Python操作圖片的相關(guān)技巧,需要的朋友可以參考下
    2015-04-04
  • python之wxPython菜單使用詳解

    python之wxPython菜單使用詳解

    這篇文章主要介紹了python中wxPython菜單使用方法,可實(shí)現(xiàn)給彈出菜單項(xiàng)添加圖標(biāo)的功能,在Python程序設(shè)計(jì)中非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2014-09-09
  • wxPython框架類(lèi)和面板類(lèi)的使用實(shí)例

    wxPython框架類(lèi)和面板類(lèi)的使用實(shí)例

    這篇文章主要介紹了wxPython框架類(lèi)和面板類(lèi)的使用實(shí)例,主要實(shí)現(xiàn)了自定義框架類(lèi)及其完整的調(diào)用方法,代碼簡(jiǎn)單高效,是進(jìn)一步學(xué)習(xí)wxPython框架類(lèi)的基礎(chǔ),需要的朋友可以參考下
    2014-09-09
  • python實(shí)現(xiàn)的MySQL增刪改查操作實(shí)例小結(jié)

    python實(shí)現(xiàn)的MySQL增刪改查操作實(shí)例小結(jié)

    這篇文章主要介紹了python實(shí)現(xiàn)的MySQL增刪改查操作,結(jié)合實(shí)例形式總結(jié)分析了Python基本的mysql增刪改查及銀行賬號(hào)查詢等相關(guān)操作實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2018-12-12
  • 一篇文章帶你了解Python中的類(lèi)

    一篇文章帶你了解Python中的類(lèi)

    這篇文章主要給大家介紹了關(guān)于Python中類(lèi)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-09-09
  • 詳解Python使用OpenCV如何確定一個(gè)對(duì)象的方向

    詳解Python使用OpenCV如何確定一個(gè)對(duì)象的方向

    在本教程中,我們將構(gòu)建一個(gè)程序,該程序可以使用流行的計(jì)算機(jī)視覺(jué)庫(kù) OpenCV 確定對(duì)象的方向(即以度為單位的旋轉(zhuǎn)角度),感興趣的小伙伴可以了解一下
    2022-10-10
  • Python 獲取當(dāng)前所在目錄的方法詳解

    Python 獲取當(dāng)前所在目錄的方法詳解

    本文給大家講解的是使用python獲取當(dāng)前所在目錄的方法以及相關(guān)示例,非常的清晰簡(jiǎn)單,有需要的小伙伴可以參考下
    2017-08-08
  • Python Paramiko實(shí)現(xiàn)SSHv2協(xié)議輕松管理遠(yuǎn)程服務(wù)器

    Python Paramiko實(shí)現(xiàn)SSHv2協(xié)議輕松管理遠(yuǎn)程服務(wù)器

    這篇文章主要為大家介紹了Python Paramiko實(shí)現(xiàn)SSHv2協(xié)議輕松管理遠(yuǎn)程服務(wù)器,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Python數(shù)據(jù)處理利器Slice函數(shù)用法詳解

    Python數(shù)據(jù)處理利器Slice函數(shù)用法詳解

    這篇文章主要給大家介紹了關(guān)于Python數(shù)據(jù)處理利器Slice函數(shù)用法的相關(guān)資料,slice函數(shù)是Python中的一個(gè)內(nèi)置函數(shù),用于對(duì)序列進(jìn)行切片操作,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • Python利用pdfplumber庫(kù)提取pdf中表格數(shù)據(jù)

    Python利用pdfplumber庫(kù)提取pdf中表格數(shù)據(jù)

    pdfplumber是一個(gè)用于從PDF文檔中提取文本和表格數(shù)據(jù)的Python庫(kù),它可以幫助用戶輕松地從PDF文件中提取有用的信息,例如表格、文本、元數(shù)據(jù)等,本文介紹了如何通過(guò)Python的pdfplumber庫(kù)提取pdf中表格數(shù)據(jù),感興趣的同學(xué)可以參考一下
    2023-05-05

最新評(píng)論