Blob Detection
This program demonstrates how to use BLOB to detect and filter region.
Sources:
Contents
Image
img = cv.imread(fullfile(mexopencv.root(),'test','detect_blob.png'), 'Color',true); img = rot90(img);
Detector Parameters
this is default parameters for cv.SimpleBlobDetector
params = struct(); params.ThresholdStep = 10; params.MinThreshold = 10; params.MaxThreshold = 220; params.MinRepeatability = 2; params.MinDistBetweenBlobs = 10; params.FilterByColor = false; params.BlobColor = 0; params.FilterByArea = false; params.MinArea = 25; params.MaxArea = 5000; params.FilterByCircularity = false; params.MinCircularity = 0.9; params.MaxCircularity = 1e37; params.FilterByInertia = false; params.MinInertiaRatio = 0.1; params.MaxInertiaRatio = 1e37; params.FilterByConvexity = false; params.MinConvexity = 0.95; params.MaxConvexity = 1e37;
we are going to detect blobs with 6 differents param configurations
p = repmat(params, 6, 1);
1st: we want all
p(1).FilterByArea = true; p(1).MinArea = 1; p(1).MaxArea = size(img,1) * size(img,2);
2nd: we want area between 500 and 2900 pixels
p(2).FilterByArea = true; p(2).MinArea = 500; p(2).MaxArea = 2900;
3rd: we want only circular object
p(3).FilterByCircularity = true;
4th: we want ratio inertia
p(4).FilterByInertia = true; p(4).MinInertiaRatio = 0; p(4).MaxInertiaRatio = 0.2;
5th: we want convexity
p(5).FilterByConvexity = true; p(5).MinConvexity = 0; p(5).MaxConvexity = 0.9;
6th: we want blob with gravity center color equal to 0 (dark blobs)
p(6).FilterByColor = true; p(6).BlobColor = 0;
helper function to convert params struct to pairs of name/value options
getopts = @(s) reshape([fieldnames(s), struct2cell(s)]', 1, []);
Detect
blob detectors loop
for i=1:numel(p) % create detector using specified options opts = getopts(p(i)); sbd = cv.SimpleBlobDetector(opts{:}); % detect keypoint kpts = sbd.detect(img); % draw results out = cv.drawKeypoints(img, kpts); for k=1:numel(kpts) out = cv.circle(out, kpts(k).pt, round(kpts(k).size), ... 'Color',randi([0 255],[1 3])); end % show output figure('Name',sprintf('BLOB%d',i)) imshow(out) % create a title to describe current parameters str = {}; if p(i).FilterByArea str{end+1} = sprintf('Area range [%g to %g]', ... p(i).MinArea, p(i).MaxArea); end if p(i).FilterByCircularity str{end+1} = sprintf('Circularity range [%g to %g]', ... p(i).MinCircularity, p(i).MaxCircularity); end if p(i).FilterByColor str{end+1} = sprintf('Blob color %g', p(i).BlobColor); end if p(i).FilterByConvexity str{end+1} = sprintf('Convexity range [%g to %g]', ... p(i).MinConvexity, p(i).MaxConvexity); end if p(i).FilterByInertia str{end+1} = sprintf('Inertia ratio range [%g to %g]', ... p(i).MinInertiaRatio, p(i).MaxInertiaRatio); end title(str) end