Python代碼使用OpenCV進行Blob檢測|blob|opencv|二進位|算法_網易...

2021-01-08 網易

  

  blob

  什麼是Blob?

  blob是圖像中一組共享的區域,它們具有一些共同的屬性(例如灰度值,形狀,尺寸等)blob檢測的目的是識別並標記一些特定區域,blob檢測在自動化工業領域比較常見。

  OpenCV提供了一種方便的方法來檢測blob並根據不同的特徵對其進行過濾。那就是

  SimpleBlobDetector檢測算法

  OpenCV實現的算法如下:

  

  1. 對[minThreshold,maxThreshold)區間,以thresholdStep為間隔,做多次二值化。

  

  2. 對每張二值圖片,使用提取連通域並計算每一個連通域的中心。

  

  3. 根據2得到的中心,全部放在一起。一些很接近的點[由theminDistBetweenBlobs控制多少才算接近]被歸為一個group,對應一個bolb特徵..

  

  4. 從3得到的那些點,估計最後的blob特徵和相應半徑,並以key points返回。

  

  首先我們先按照默認的配置建立一個簡單的blob檢測實例

  import cv2
import numpy as np;
im = cv2.imread("blob_detection.jpg", cv2.IMREAD_GRAYSCALE)
detector = cv2.SimpleBlobDetector_create()
keypoints = detector.detect(im)
with_keypoints = cv2.drawKeypoints(im, keypoints, np.array([]),
(0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow("Keypoints", with_keypoints)
cv2.waitKey(0)

  首先我們讀入一張需要檢測的圖片

  並使用cv2.SimpleBlobDetector_create檢測函數建立一個檢測器,這裡需要注意的是CV2 3.0以前的版本,請使用cv2.SimpleBlobDetector函數,這裡的cv2.IMREAD_GRAYSCALE便是打開圖片的時候並轉換成灰度空間,這個跟函數cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)實現的功能一樣,只是2種不同的寫法。

  然後使用detector.detect函數,對圖片進行檢測,函數返回檢測到的關鍵點

  最後使用cv2.drawKeypoints函數畫出圖片中檢測到的blob即可

  cv2.drawKeypoints()函數主要包含五個參數:

  · image:也就是原始圖片
· keypoints:從原圖中獲得的關鍵點,這也是畫圖時所用到的數據
· outputimage:輸出
· color:顏色設置,通過修改(b,g,r)的值,更改畫筆的顏色,b=藍色,g=綠色,r=紅色。
· flags:繪圖功能的標識設置,主要包括如下:
cv2.DRAW_MATCHES_FLAGS_DEFAULT,
cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS,
cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG,
cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS

  

  代碼截圖

  SimpleBlobDetector基於以下描述的相當簡單的算法。該算法由不同的參數控制

  

  blob

  閾值處理:通過使用以minThreshold開始的閾值對源圖像進行閾值處理,將源圖像轉換為多個二進位圖像 。這些閾值以thresholdStep遞增, 直到 maxThreshold。

  因此,第一個閾值為 minThreshold,

  第二個閾值為 minThreshold + thresholdStep,

  第三個閾 值為 minThreshold + 2 x thresholdStep,依此類推。

  1. 分組:在每個二進位圖像中,連接的白色像素被分組在一起。我們稱這些二進位斑點為一。

  2. 合併 :計算二進位圖像中二進位斑點的中心,並合併比minDistBetweenBlob 更近的斑點 。

  3. 中心和半徑計算:計算並返回新合併的Blob的中心和半徑。

  按顏色,大小和形狀過濾斑點

  可以設置SimpleBlobDetector的參數以過濾所需的Blob類型。

  

  · 按顏色:首先,您需要設置 filterByColor =1。設置 blobColor = 0以選擇較暗的blob,將 blobColor = 255設置為較淺的blob。

  

  · 按大小:通過設置參數filterByArea = 1以及minArea 和maxArea的適當值, 可以基於大小過濾blob 。例如,設置 minArea = 100將濾除所有少於100個像素的斑點。

  

  · 按形狀:現在形狀具有三個不同的參數。

  

  1. 圓度:這只是測量斑點距圓的距離。例如,正六邊形的圓度比正方形大。要按圓度過濾,請設置 filterByCircularity =1。然後為minCircularity 和maxCircularity設置適當的值。圓度定義為。

  圓度

  這意味著圓的圓度為1,正方形的圓度為0.785,依此類推。

  

  圓度

  2. 凸性:一張圖片值一千字。凸度定義為(斑點的面積/凸包的面積)。現在,形狀的凸包是完全封閉該形狀的最緊密的凸形。由凸濾波器,集 filterByConvexity = 1 ,然後設置0≤ minConvexity ≤1和maxConvexity(≤1)

  

  凸性

  3. 慣性比:對於一個圓,該值是1,對於橢圓它是0和1之間,而對於線是0。要通過過濾器慣量比,設置 filterByInertia = 1 , 並設置0≤ minInertiaRatio ≤1和 maxInertiaRatio (≤1 )適當地。

  

  慣性比

  通過以上參數的設計,我們可以選擇符合我們需求的blob值進行檢測

  import cv2
import numpy as np
im = cv2.imread("blob.jpg", cv2.IMREAD_GRAYSCALE)
params = cv2.SimpleBlobDetector_Params()
# 設置閾值
params.minThreshold = 10
params.maxThreshold = 200
# 設置選擇區域
params.filterByArea = True
params.minArea = 1500
# 設置圓度
params.filterByCircularity = True
params.minCircularity = 0.1
# 設置凸度
params.filterByConvexity = True
params.minConvexity = 0.87
# 設置慣性比
params.filterByInertia = True
params.minInertiaRatio = 0.01
detector = cv2.SimpleBlobDetector_create(params)
keypoints = detector.detect(im)
with_keypoints = cv2.drawKeypoints(im, keypoints, np.array([]),
(0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow("Keypoints",with_keypoints)
cv2.waitKey(0)

  首先使用cv2.SimpleBlobDetector_Params函數對不同參數進行調整,其主要參數如下:

  SimpleBlobDetector::Params()
{ thresholdStep = 10; #二值化的閾值步長,即公式1的t
minThreshold = 50; #二值化的起始閾值,即公式1的T1
maxThreshold = 220; #二值化的終止閾值,即公式1的T2 #重複的最小次數,只有屬於灰度圖像斑點的那些二值圖像斑點數量大於該值時,該灰度圖像斑點才被認為是特徵點
minRepeatability = 2; #最小的斑點距離,不同二值圖像的斑點間距離小於該值時,被認為是同一個位置的斑點,否則是不同位置上的斑點
minDistBetweenBlobs = 10;
filterByColor = true; #斑點顏色的限制變量
blobColor = 0; #表示只提取黑色斑點;如果該變量為255,表示只提取白色斑點
filterByArea = true; #斑點面積的限制變量
minArea = 25; #斑點的最小面積
maxArea = 5000; #斑點的最大面積
filterByCircularity = false; #斑點圓度的限制變量,默認是不限制
minCircularity = 0.8f; #斑點的最小圓度 #斑點的最大圓度,所能表示的float類型的最大值
maxCircularity = std::numeric_limits::max();
filterByInertia = true; #斑點慣性率的限制變量
minInertiaRatio = 0.1f; #斑點的最小慣性率
maxInertiaRatio = std::numeric_limits::max(); #斑點的最大慣性率
filterByConvexity = true; #斑點凸度的限制變量
minConvexity = 0.95f; #斑點的最小凸度
maxConvexity = std::numeric_limits::max(); #斑點的最大凸度}

  首先我們定義好不同的參數,包含:閾值,尺寸,圓度,凸度,慣性比等參數,這些參數可以過濾到我們不需要的blob,運行以上代碼便可以查看結果

  

  blob檢測

  

  代碼截圖

  一般blob的主要應用於工業領域,比如產品的壞點檢測,自動化產線上的產品尺寸大小檢測,產品方向,位置,角度檢測等等

  這就需要使用視頻實時檢測

  Blob的視頻實時檢測 import cv2
import numpy as np
import time
params = cv2.SimpleBlobDetector_Params()
# 設置閾值
params.minThreshold = 10
params.maxThreshold = 200
# 設置選擇區域
params.filterByArea = True
params.minArea = 1500
# 設置圓度
params.filterByCircularity = True
params.minCircularity = 0.1
# 設置凸度
params.filterByConvexity = True
params.minConvexity = 0.87
# 這種慣性比
params.filterByInertia = True
params.minInertiaRatio = 0.01
detector = cv2.SimpleBlobDetector_create(params)

  首先安裝圖片檢測原理圖,設置SimpleBlobDetector的檢測參數,並初始化SimpleBlobDetector檢測函數

  

  代碼截圖

  初始化完成後,便可以打開攝像頭,進行視頻的實時檢測

  capture = cv2.VideoCapture(0)
time.sleep(2)
cv2.namedWindow('blob',cv2.WINDOW_AUTOSIZE)

  while(1):
ret, frame = capture.read()
im = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
keypoints = detector.detect(im)
with_keypoints = cv2.drawKeypoints(frame, keypoints, np.array([]),
(0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow("Keypoints",with_keypoints)
if cv2.waitKey(5)&0xFF == ord('q'):
break
capture.release()
cv2.destroyAllWindows()

  這裡需要注意的是cv2.VideoCapture(0)打開默認的攝像頭,這裡若想要檢測視頻,可以輸入視頻的絕對路徑地址

  1、frame = cv2.VideoCapture(0)
VideoCapture()中參數是0,表示打開筆記本的內置攝像頭,參數是視頻文件路徑則打開視頻,
如frame= cv2.VideoCapture("../test.avi")
2、ret,frame = cap.read()
cap.read()按幀讀取視頻,ret,frame是獲cap.read()方法的兩個返回值。
其中ret是布爾值,如果讀取幀是正確的則返回True,如果文件讀取到結尾,
它的返回值就為False。frame就是每一幀的圖像,是個三維矩陣。
3、cv2.waitKey(1),waitKey()方法本身表示等待鍵盤輸入,
參數是1,表示延時1ms切換到下一幀圖像,對於視頻而言;
參數為0,如cv2.waitKey(0)只顯示當前幀圖像,相當於視頻暫停,等待用戶輸入任意鍵;
參數過大如cv2.waitKey(1000),會因為延時過久而卡頓感覺到卡頓。 當鍵盤輸入q字母時,退出程序運行
4、調用release()釋放攝像頭,調用destroyAllWindows()關閉所有圖像窗口。

  

  代碼截圖

特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺「網易號」用戶上傳並發布,本平臺僅提供信息存儲服務。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關焦點

  • 世界上最好的語言PHP:OpenCV與計算機視覺已在我掌控之下
    本文從實踐的角度介紹了如何使用 PHP 與 OpenCV 構建人臉檢測、人臉識別、超解析度與目標檢測等系統,因此 PHP 的各位擁躉們,可以盡情使用 OpenCV 探索計算機視覺了。本文首發於公眾號機器之心(ID:almosthuman2014),部分代碼格式有誤可參閱原文章。
  • 基於opencv 的圖像處理入門教程
    前言雖然計算機視覺領域目前基本是以深度學習算法為主,但實際上很多時候對圖片的很多處理方法,並不需要採用深度學習的網絡模型,採用目前成熟的圖像處理庫即可實現,比如 OpenCV 和 PIL ,對圖片進行簡單的調整大小、裁剪、旋轉,或者是對圖片的模糊操作。
  • 如何快速簡單的安裝opencv-python
    :按下Win+R ,輸入cmd 回車 ,輸入pip install opencv-contrib-python回車,開始下載安裝,安裝完成後進行測試一下。下面安裝python IDE(集成開發環境),Cmd窗口輸入 pip install spyder 安裝完成後,在cmd窗口輸入spyder3啟動開發環境,就可以敲代碼了。至於怎麼敲,請見下回分解!
  • 使用OpenCV和Python構建自己的車輛檢測模型
    我們人類可以很容易地在一瞬間從複雜的場景中檢測和識別出物體。然而,將這種思維過程轉化為機器的思維,需要我們學習使用計算機視覺算法進行目標檢測。因此在本文中,我們將建立一個自動車輛檢測器和計數器模型。以下視頻是你可以期待的體驗:https://youtu.be/C_iZ2yivskE注意:還不懂深度學習和計算機視覺的新概念?
  • OpenCV中的快速直線檢測
    該函數是LineSegmentDetector因版權問題從OpenCV中移除後最易用的直線檢測小能手,沒有之一。本文介紹該功能的使用方法其輸出結果剖析。在python的opencv相關的安裝包中,opencv-python 包含主要模塊,opencv-contrib-python 包含主要模塊以及一些擴展模塊。但這兩個模塊並不兼容,如果已經安裝過opencv-python,需要先卸載,再安裝opencv-contrib-python。
  • OpenCV+深度學習預訓練模型,簡單搞定圖像識別 | 教程
    另外,新版本中使用預訓練深度學習模型的API同時兼容C++和Python,讓系列操作變得非常簡便:從硬碟加載模型;對輸入圖像進行預處理;將圖像輸入網絡GoogleLeNet出自Szegedy等人2014年的論文Going Deeper with Convolutions,詳情見:https://arxiv.org/abs/1409.4842首先,打開一個新文件,將其命名為deep_learning_with_opencv.py,插入如下代碼,來導入我們需要的包:然後拆解命令行參數:其中第8行ap = argparse.ArgumentParser
  • 「python opencv視覺零基礎」十四、直方圖反向投影
    前文提醒:博主正在參加博客之星評比,成功入選Top200,現在暫居第九歡迎各位點擊了解更多幫我投票,非常感謝~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python
  • 「python opencv視覺零基礎實戰」七邏輯運算應用
    一、學習目標了解opencv中圖像的邏輯運算了解opencv中邏輯運算的應用如有錯誤歡迎指出~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python
  • opencv-python獲取圖像:面向對象與面向過程
    Lena圖像在科研領域流行的原因:1.該圖適度的混合了細節、平滑區域、陰影和紋理,從而能很好的測試各種圖像處理算法。2.Lenna是個美女,對於圖像處理界的研究者(大部分都是男性)來說,美女圖可以有效地吸引他們來做研究。
  • 「python opencv計算機視覺零基礎到實戰」九模糊
    一、學習目標了解什麼是卷積了解模糊的使用方法與應用目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰」 第四節色彩空間
  • 「python opencv視覺零基礎」十、圖片效果毛玻璃
    一、學習目標了解高斯模糊的使用方法了解毛玻璃的圖片效果添加了解如何自己做一個噪聲圖片目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰
  • 史上最全 OpenCV 活體檢測教程!
    在本文中,Adrian 將就「如何鑑別圖像/視頻中的真實人臉和偽造人臉」這一問題進行深入的分析,並介紹使用基於 OpenCV 的模型進行活體檢測的具體方法。雷鋒網 AI 科技評論編譯如下。雷鋒網(公眾號:雷鋒網)本教程將教授你如何使用 OpenCV 進行活性檢測。
  • 基於TensorFlow 、OpenCV 和 Docker 的實時視頻目標檢測
    在數據科學和機器學習領域,每周都會發布許多新的算法,工具和程序,直接在你的計算機目錄上安裝調試這些代碼、程序會讓系統變得凌亂不堪。為了防止這種情況,我使用 Docker 容器來創建我的數據科學工作區將程序部署在容器中。你可以在我的代碼庫中找到這個項目的 Dockerfile。
  • OpenCV(四)邊緣檢測
    在我們需要檢測表面紋理和表面形狀時,我們往往需要更細緻的檢測,比如基於二階導數的Canny,但是很多時候簡單的基於一階導數的算子想過可能更好。不同的算子由於其具體算法不同,實際效果也存在比較大的差距。具體情況還需要具體處理。
  • opencv-python圖像預處理-濾波
    為了消除外界環境對圖像採集的幹擾,增強圖像的邊緣及灰度跳變的部分,使圖像變得清晰以及提高圖像處理速度需要對圖像進行預處理操作,主要是對圖像進行濾波和增強操作。使用的方法可以分為空間域處理和頻率域處理兩類。空間域指圖像平面本身,這類圖像處理方法用各種模板直接與圖像進行卷積運算,實現對圖像的處理。
  • 「python opencv視覺零到實戰」八、圖片選區操作
    一、學習目標了解什麼是ROI了解floodFill的使用方法如有錯誤歡迎指出~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰
  • OpenCV特徵點檢測——ORB特徵
    主要思路就是在特徵點附近隨機選取若干點對,將這些點對的灰度值的大小,組合成一個二進位串,並將這個二進位串作為該特徵點的特徵描述子。詳細算法描述參考如下論文:Calonder M., Lepetit V., Strecha C., Fua P.: BRIEF: Binary Robust Independent Elementary Features.
  • 目標檢測必須要OpenCV?10行Python代碼也能實現,親測好用!
    無人超市、人臉識別、無人駕駛,眾多的使用場景及案例,使得【目標檢測】正成為計算機視覺最有前景的方向。聽起來似乎是個很難實現的技術,需要大量訓練數據和算法才能完成。事實上,本文作者開發了一個基於Python的函數庫,可以用十行代碼高效實現目標檢測。還不熟悉的讀者,我們先來看看,目標檢測到底是什麼,以及軟體開發人員面臨的挑戰。
  • 基於OpenCv 和 Python 的手指識別及追蹤
    翻譯 | 餘杭 Lamaric 校對 | 吳曉曼 審核 | 餘杭詳細代碼參考:https://github.com/amarlearning/opencv手指追蹤是許多計算機視覺應用的重要特徵。在該應用中,使用基於直方圖的方法將手與背景幀分離。
  • 使用Python+OpenCV進行圖像處理(二)
    圖像分割與分水嶺(Watershed)算法(TBU)在邊緣和輪廓檢測中,噪聲對檢測的精度有很大的影響。因此,去除噪聲和控制像素值的大小可以幫助模型聚焦於整體特徵,獲得更高的精度。讓我們用下面的代碼對比處理結果。(為了便於比較,將把原始圖像加到結果中,進行對比顯示。)