2016-04-20 3 views
3

Я запускаю обнаружение blob на изображении камеры круговых объектов, используя OpenCV 2.4.9. Я запускаю ряд стандартных фильтров на изображении (размытие, адаптивный порог, скелетонирование с использованием схем скинов и расширение каркаса) и хотел бы определить результат (сплошные черные области) на результат. Для этого есть SimpleBlobDetector, но, однако, я устанавливаю его параметры, он не делает то, что я хотел бы.настройка параметров обнаружения блоба в python

Это исходное изображение: caputred image

и это обработанная версия, с характерными точками от детектора нарисованного в желтом цвете: skeletonization

В ключевых точках, кажется, не соблюдать ограничение зоны, и также не появляются там, где я ожидал бы их.

Сценарий выглядит следующим образом: есть ли что-то явно неправильное? Или любые другие предложения?

import numpy as np 
import cv2 
import skimage, skimage.morphology 

img0=cv2.imread('capture_b_07.cropped.png') 
img1=cv2.cvtColor(img0,cv2.COLOR_BGR2GRAY) 
img2=cv2.medianBlur(img1,5) 
img3=cv2.bilateralFilter(img2,9,75,75) 
img4=cv2.adaptiveThreshold(img3,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY_INV,21,0) 
img5=skimage.img_as_ubyte(skimage.morphology.skeletonize(skimage.img_as_bool(img4))) 
img6=cv2.dilate(img5,cv2.getStructuringElement(cv2.MORPH_RECT,(3,3)),iterations=1) 
# blob detection 
pp=cv2.SimpleBlobDetector_Params() 
pp.filterByColor=True 
pp.blobColor=0 
pp.filterByArea=True 
pp.minArea=500 
pp.maxArea=5000 
pp.filterByCircularity=True 
pp.minCircularity=.4 
pp.maxCircularity=1. 

det=cv2.SimpleBlobDetector(pp) 
keypts=det.detect(img6) 
img7=cv2.drawKeypoints(img6,keypts,np.array([]),(0,255,255),cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) 
cv2.imwrite('capture_b_07.blobs.png',img7) 

Похожие трубопровод из ImageJ (Анализ частиц, округлость 0,5-1,0, площадь 500-5000 точек^2), который я пытаюсь воспроизвести с помощью OpenCV, дает что-то вроде этого:

imagej blobs

+0

Вы сможете получить аналогичную сегментацию, что и ImageJ использования водораздела. – dhanushka

ответ

1

Вы можете получить аналогичный результат с ImageJ, используя водораздел. Я перевернул ваш img6, маркировал его, а затем использовал его в качестве маркера для opencv watershed. Затем я расширил сегментированные граничные линии водораздела с использованием морфологического фильтра и нашел связанные компоненты, используя opencv findContours. Ниже приведены результаты. Не уверен, что это то, что вы хотите. Я не отправляю код, так как я быстро попробовал это с комбинацией python и c++, так что это немного грязно.

водораздела сегментация

ws

связных компоненты cc

+0

Спасибо за предложение, я рассмотрю водораздел, но он не позволяет мне фильтровать капли по площади или округлости (именно это делает ImageJ игнорировать 2 соседних гранулы, которые не разделены в скелетонизированном изображении, что-то очень желательно). Так что я все еще удивляюсь, почему SimpleBlobDetector не делает то, что я думаю. – eudoxos

Смежные вопросы