I am trying to write a program that uses computer vision techniques to detect (and track) tiny blobs in a stream of very noisy images. My data is of two types: one set of images are not so noisy, which I am just using to try different techniques with, and the other set are noisier, and this is where the detection needs to work at the end. Here are some samples of the higher-noise images. The blobs that need to be detected are the small black spots near the center of the image.
Initially I started off with a simple contour/blob detection techniques in OpenCV, which were not very helpful. Eventually I moved on to techniques such as "opening" the image using morphological operators, and subsequently performing a Laplacian of Gaussian blob detection to detect areas of interest. This gave me better results for the low-noise versions of the images, but fails when it comes to the high-noise ones: gives me too many false positives. Here is a result from a low-noise image (please note input image was inverted).
The code for my current LoG based approach in MATLAB goes as below:
while ~isDone(videoReader) frame = step(videoReader); roi_frame = imcrop(frame, [660 410 120 110]); I_roi = rgb2gray(roi_frame); I_roi = imcomplement(I_roi); I_roi = wiener2(I_roi, [5 5]); background = imopen(I_roi,strel('disk',3)); I2 = imadjust(I_roi - background); K = imgaussfilt(I2, 5); level = graythresh(K); bw = im2bw(I2); sigma = 3; % Filter image with LoG I = double(bw); h = fspecial('log',sigma*30,sigma); Ifilt = -imfilter(I,h); % Threshold for points of interest Ifilt(Ifilt < 0.001) = 0; % Dilate to obtain local maxima Idil = imdilate(Ifilt,strel('disk',50)); % This is the final image P = (Ifilt == Idil) .* Ifilt;
Is there any way I can improve my current detection technique to make it work for images with a lot of background noise? Or are there techniques better suited for images like this?