我正在尝试编写一个程序,该程序使用计算机视觉技术来检测(和跟踪)非常嘈杂的图像流中的微小斑点。我的数据有两种类型:一组图像没有那么嘈杂,我只是用它来尝试不同的技术,而另一组图像比较嘈杂,这就是最终需要进行检测的地方。以下是一些高噪声图像的示例。需要检测的斑点是图像中心附近的小黑点。
最初,我从 OpenCV 中的一个简单的轮廓/斑点检测技术开始,这并不是很有帮助。最终,我转向了诸如使用形态算子“打开”图像之类的技术,然后执行高斯斑点检测的拉普拉斯算子来检测感兴趣的区域。对于图像的低噪声版本,这给了我更好的结果,但在涉及高噪声版本时却失败了:给了我太多的误报。这是来自低噪声图像的结果(请注意输入图像被反转)。
我当前在 MATLAB 中基于 LoG 的方法的代码如下:
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;
有什么方法可以改进我目前的检测技术,使其适用于具有大量背景噪声的图像?还是有更适合此类图像的技术?