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.