Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 噪声图像中小斑点的检测技术_Matlab_Opencv_Image Processing_Computer Vision - Fatal编程技术网

Matlab 噪声图像中小斑点的检测技术

Matlab 噪声图像中小斑点的检测技术,matlab,opencv,image-processing,computer-vision,Matlab,Opencv,Image Processing,Computer Vision,我正试图编写一个程序,使用计算机视觉技术来检测(和跟踪)非常嘈杂的图像流中的微小斑点。图像流来自双X射线成像设置,该设置输出左视图和右视图(由于准直不同,因此大小不同)。我的数据有两种类型:一组图像没有太大的噪声,我只是用它来尝试不同的技术,另一组噪声更大,这就是最后需要检测的地方。图像流的频率为60 Hz。这是来自X射线成像仪的原始图像示例: 这里是一些裁剪出来的感兴趣区域的样本。需要检测的斑点是图像中心附近的小黑点 起初,我在OpenCV中使用了一种简单的轮廓/斑点检测技术,这并没有太大

我正试图编写一个程序,使用计算机视觉技术来检测(和跟踪)非常嘈杂的图像流中的微小斑点。图像流来自双X射线成像设置,该设置输出左视图和右视图(由于准直不同,因此大小不同)。我的数据有两种类型:一组图像没有太大的噪声,我只是用它来尝试不同的技术,另一组噪声更大,这就是最后需要检测的地方。图像流的频率为60 Hz。这是来自X射线成像仪的原始图像示例:

这里是一些裁剪出来的感兴趣区域的样本。需要检测的斑点是图像中心附近的小黑点

起初,我在OpenCV中使用了一种简单的轮廓/斑点检测技术,这并没有太大帮助。最后,我转向了一些技术,比如使用形态学算子“打开”图像,然后执行拉普拉斯高斯斑点检测来检测感兴趣的区域。对于低噪声版本的图像,这给了我更好的结果,但对于高噪声版本,这就失败了:给了我太多的误报。这是一个低噪声图像的结果(请注意,输入图像是反转的)

我目前在MATLAB中基于日志的方法的代码如下所示:

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;
while~isDone(视频阅读器)
帧=步进(视频阅读器);
roi_frame=imcrop(frame[660 410 120 110]);
I_roi=rgb2gray(roi_帧);
I_roi=imcomplete(I_roi);
I_-roi=wiener2(I_-roi[5]);
背景=iOpen(I_roi,strel('disk',3));
I2=imadjust(I_roi-背景);
K=imgaussfilt(I2,5);
级别=灰度阈值(K);
bw=im2bw(I2);
西格玛=3;
%使用日志过滤图像
I=双倍(bw);
h=f特殊('log',西格玛*30,西格玛);
Ifilt=-imfilter(I,h);
%兴趣点的阈值
Ifilt(Ifilt<0.001)=0;
%扩张以获得局部极大值
Idil=扩张(Ifilt,strel('disk',50));
%这是最终的图像
P=(Ifilt==Idil)。*Ifilt;

有什么方法可以改进我目前的检测技术,使其适用于背景噪声较大的图像?还是有更适合这种图像的技术

我将采取的方法:

-平均背景减法

-积极的高斯平滑(,在我的头顶上,我想你想要sigma大约是你物体最小横截面的一半,但你可能想要摆弄它)基本上目标是在不完全丢失目标物体(基于形状和大小)的情况下尽可能模糊噪声

-边缘检测。如果可能的话,尽量针对对象(基本上,在高斯平滑后观察对象的边缘,并将边缘检测设置为查找宽度和对比度偏移)

-可以考虑在这里运行关闭操作。< /P> -根据大小和形状搜索整个图像中的孤岛(全封闭区域)过滤器

我有一种预感,尽管信噪比非常低,但你的噪声粒度有望大大小于你的对象大小。(如果你的噪音与你的物体具有相同的对比度和大致相同的大小,那么你就沉沦了,需要重新评估你的获得)


另一个注意事项是基于您的速度需求。通过了解最后的已知位置和局部搜索,以及了解新目标可以从何处进入图像,可以节省大量的处理成本。

相机和场景是否静止,只有斑点在移动?斑点移动的速度有多快,帧速率是多少?为什么图像的大小都不同?由于您的图像是流的一部分,我认为您需要利用它来减少噪音。根据帧速率,我会考虑将帧的最后几秒钟的移动平均值作为基准和最后2-4帧的平均值,然后进行差分,以便消除噪声。如果不了解更多有关设置的信息,很难说。这可能是有用的。。。您可能希望使用更稳健的跟踪方法,例如,您的“目标对象”的大小、形状和/或反射率是否一致?(可变性是什么)您是否也可以发布一张没有任何对象的图片(如果有)?