轉載:(158條消息) Opencv之斑點(Blob)檢測--SimpleBlobDetector_create_ancy的博客-CSDN博客
斑點(Blob)的定義: 圖像特征點檢測包括角點和斑點,斑點是指二維圖像中和周圍顏色有顏色差異和灰度差異的區域,因為斑點代表的是一個區域,所以其相對於單純的角點,具有更好的穩定性和更好的抗干擾能力.斑點通常是指與周圍有着顏色和灰度差別的區域。在實際地圖中,往往存在着大量這樣的斑點,如一顆樹是一個斑點,一塊草地是一個斑點,一棟房子也可以是一個斑點。由於斑點代表的是一個區域,相比單純的角點,它的穩定性要好,抗噪聲能力要強,所以它在圖像配准上扮演了很重要的角色。同時有時圖像中的斑點也是我們關心的區域,比如在醫學與生物領域,我們需要從一些X光照片或細胞顯微照片中提取一些具有特殊意義的斑點的位置或數量。
SimpleBlobDetector_create的原理:
1. 閾值:通過使用以minThreshold開始的閾值對源圖像進行閾值處理,將源圖像轉換為多個二進制圖像。這些閾值以thresholdStep遞增,直到maxThreshold。因此,第一個閾值為minThreshold,第二個閾值為minThreshold + thresholdStep,第三個閾值為minThreshold + 2 x thresholdStep,依此類推;
2. 分組:在每個二進制圖像中,連接的白色像素被分組在一起。我們稱這些二進制blob;
3. 合並:計算二進制圖像中二進制斑點的中心,並合並比minDistBetweenBlob更近的斑點;
4. 中心和半徑計算:計算並返回新合並的Blob的中心和半徑。
SimpleBlobDetector_create可按顏色,大小和形狀來過濾斑點類型:
1. 按顏色:首先需要設置filterByColor =True。設置blobColor = 0可選擇較暗的blob,blobColor = 255可以選擇較淺的blob。
2. 按大小:可以通過設置參數filterByArea = 1以及minArea和maxArea的適當值來基於大小過濾blob。例如。設置minArea = 100將濾除所有少於100個像素的斑點。
3. 按圓度:這只是測量斑點距圓的距離。例如。正六邊形的圓度比正方形高。要按圓度過濾,請設置filterByCircularity =1。然后為minCircularity和maxCircularity設置適當的值。圓度定義為()。圓的為圓度為1,正方形的圓度為PI/4,依此類推。
4. 按凸性:凸度定義為(斑點的面積/凸包的面積)。現在,形狀的“凸包”是最緊密的凸形,它完全包圍了該形狀,用不嚴謹的話來講,給定二維平面上的點集,凸包就是將最外層的點連接起來構成的凸多邊形,它能包含點集中所有的點。直觀感受上,凸性越高則里面“奇怪的部分”越少。要按凸度過濾,需設置filterByConvexity = true,minConvexity、maxConvexity應該屬於[0,1],而且maxConvexity> minConvexity。
5. 按慣性比:這個詞匯比較抽象。我們需要知道Ratio可以衡量形狀的伸長程度。簡單來說。對於圓,此值是1,對於橢圓,它在0到1之間,對於直線,它是0。按慣性比過濾,設置filterByInertia = true,並設置minInertiaRatio、maxInertiaRatio同樣屬於[0,1]並且maxConvexity> minConvexity。
按凸性(左低右高) 按慣性比(左低右高)
SimpleBlobDetector_Params參數說明:
SimpleBlobDetector::Params::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<float>::max();
filterByInertia = true; //斑點慣性率的限制變量
minInertiaRatio = 0.1f; //斑點的最小慣性率
maxInertiaRatio = std::numeric_limits<float>::max(); //斑點的最大慣性率
filterByConvexity = true; //斑點凸度的限制變量
minConvexity = 0.95f; //斑點的最小凸度
maxConvexity = std::numeric_limits<float>::max(); //斑點的最大凸度
}
代碼展示:
# -*- coding:utf-8 -*-
import cv2
import numpy as np
# Read image
im = cv2.imread("blob.jpg", cv2.IMREAD_GRAYSCALE)
# 設置SimpleBlobDetector_Params參數
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)
# 檢測blobs.
key_points = detector.detect(im)
# 繪制blob的紅點
draw_image = cv2.drawKeypoints(im, key_points, np.array([]), (0, 0, 255),
cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
# Show blobs
cv2.imshow("key_points", draw_image)
cv2.waitKey(0)
效果展示:
————————————————
版權聲明:本文為CSDN博主「ancy_i_cv」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/u014072827/article/details/111033547