本教程闡述了使用opencv進(jìn)行簡(jiǎn)單的斑點(diǎn)檢測(cè)
什么是斑點(diǎn)?
斑點(diǎn)是圖像中的一組連接像素,它們共享一些共同屬性(例如灰度值)西乖。在下圖中,暗連通區(qū)域是斑點(diǎn)坛增,斑點(diǎn)檢測(cè)的目標(biāo)是識(shí)別和標(biāo)記這些區(qū)域获雕。
簡(jiǎn)單的斑點(diǎn)檢測(cè)器示例
opencv提供了一種檢測(cè)斑點(diǎn)的便捷方法,并根據(jù)不同的特征對(duì)其進(jìn)行過(guò)濾收捣。讓我們從最簡(jiǎn)單的例子開(kāi)始:
Python:
importcv2
importnumpyasnp
#讀圖片
im = cv2.imread('blod.jpg', cv2.IMREAD_GRAYSCALE)
#創(chuàng)建一個(gè)檢測(cè)器并使用默認(rèn)參數(shù)
detector = cv2.SimpleBlobDetector()
#檢測(cè)斑點(diǎn)
keypoints = detector.detect(im)
#將檢測(cè)到的斑點(diǎn)圈上紅色的圓圈
#DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS保證圓的大小和斑點(diǎn)大小一樣
im_with_keypoints = cv2.drawKeypoints(im, keypoints, np.array([]), (0,0,255),
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
#顯示檢測(cè)到的點(diǎn)
cv2.imshow('keypoints', im_with_keypoints)
cv2.waitKey(0)
以下是得到的檢測(cè)結(jié)果左圖是原圖届案,右圖是結(jié)果圖:
斑點(diǎn)檢測(cè)器是如何工作呢?
顧名思義罢艾,SimpleBlobDetector是一種簡(jiǎn)單的算法楣颠,該算法由檢測(cè)器的參數(shù)控制,并由以下幾步組成:
? ?? ???1.?閾值處理:?通過(guò)使用從minThreshold開(kāi)始的閾值對(duì)源圖像進(jìn)行閾值處理咐蚯,將源圖像轉(zhuǎn)換成多個(gè)二進(jìn)制圖像童漩。這些閾值以thresholdStep大小依次遞增直到maxThreshold,所以第一個(gè)閾值是minThreshold仓蛆,第二個(gè)是minThreshold+thresholdStep睁冬,第三個(gè)是minThreshold+2*thresholdStep,依此類(lèi)推看疙。
? ?? ???2. 分組:在每個(gè)二進(jìn)制圖像中豆拨,連接白色像素被分成一組,我們稱(chēng)為二進(jìn)制斑點(diǎn)
? ?? ???3.?合并:?計(jì)算二進(jìn)制圖像中二進(jìn)制斑點(diǎn)的重心能庆,并合并更靠近minDistBetweenBlobs的斑點(diǎn)
? ?? ???4. 中心和半徑計(jì)算:計(jì)算并返回新合并的斑點(diǎn)的中心點(diǎn)和半徑值
按顏色施禾,大小和形狀來(lái)過(guò)濾斑點(diǎn)
可以設(shè)置SimpleBlobDetector的參數(shù)來(lái)過(guò)濾我們想要的斑點(diǎn)類(lèi)型:
? ?? ???1.?按顏色:(注意:此功能已經(jīng)損壞,我檢查了代碼搁胆,它似乎有一個(gè)邏輯錯(cuò)誤)首先你需要設(shè)置filterByColor=1弥搞,設(shè)置blobColor=0選擇顏色更暗的斑點(diǎn)邮绿,blobColor=255選擇顏色更淺的斑點(diǎn)
? ?? ???2.?按大小:你可以通過(guò)設(shè)置參數(shù)filterByArea=1以及minArea和maxArea的適當(dāng)值來(lái)根據(jù)大小過(guò)濾斑點(diǎn)攀例,例如船逮,設(shè)置minArea=100將過(guò)濾掉所有小于100像素的斑點(diǎn)
? ?? ???3. 按形狀:現(xiàn)在形狀有三種不同的參數(shù)
? ?? ?? ?? ???3.1?圓度:這只是測(cè)量斑點(diǎn)的圓形接近程度,例如正六邊形具有比正方形更高的圓度粤铭,要按照?qǐng)A度過(guò)濾挖胃,請(qǐng)?jiān)O(shè)置filterByCircularity=1然后為minCircularity和maxCircularity設(shè)置適當(dāng)?shù)闹怠?/p>
? ?? ?? ?? ???3.2?凸度:一張圖片勝過(guò)千言萬(wàn)語(yǔ),凸度定義為它的凸起區(qū)域或者凸包的面積“鸸撸現(xiàn)在酱鸭,形狀的凸形船體是完全包圍形狀的最緊密的凸性。由凸形過(guò)濾垛吗,設(shè)置filterByConvexity=1凹髓,然后設(shè)置0<= minConvexity<=1?和?maxConvexity<=1
? ?? ?? ?? ?? ???3.3?慣性比:不要讓這嚇到你。數(shù)學(xué)家經(jīng)常使用令人困惑的詞來(lái)形容非常簡(jiǎn)單的東西怯屉。所以你必須知道的是蔚舀,這可以測(cè)量形狀的長(zhǎng)度。例如蚀之,對(duì)于一個(gè)圓該值是1蝗敢,對(duì)于橢圓它是0和1之間,而對(duì)于線(xiàn)段為0足删。為了通過(guò)慣量比過(guò)濾寿谴,設(shè)定filterByInertia = 1,并設(shè)置0≤??minInertiaRatio <=1和maxInertiaRatio<=1失受。
如何設(shè)置SimpleBlobDetector參數(shù)
設(shè)置SimpleBlobDetector參數(shù)讶泰,接下來(lái)給大家舉一個(gè)例子
Python:
#設(shè)置SimpleBlodDetector參數(shù)
params = cv2.SimpleBlobDetector_Params()
#改變閾值
params.minThreshold =10
params.maxThreshold =200
#通過(guò)面積濾波
params.filterByArea =True
params.minArea =1500
#通過(guò)圓度濾波
params.filterByCircularity =True
params.minCircularity =0.1
#通過(guò)凸度濾波
params.filterByConvexity =True
params.minConvexity =0.87
#通過(guò)慣性比濾波
params.filterByInertia =True
params.minInertiaRatio =0.01
#創(chuàng)建一個(gè)檢測(cè)器并使用默認(rèn)參數(shù)
ver = (cv2.version).split(',')
ifint(ver[0]) <3:
? ? detector = cv2.SimpleBlobDetector(params)
else:
? ? detector = cv2.SimpleBlobDetector_create(params)
openCV【實(shí)踐系列】4——使用Opencv進(jìn)行斑點(diǎn)(blob)檢測(cè)
https://bbs.easyaiforum.cn/thread-675-1-1.html
(出處: 易學(xué)智能)