用于斑点检测的替代算法

信息处理 图像处理 matlab 图片 边缘检测 检测
2022-02-04 22:10:11

这是我的实验的示例图像,将对其进行处理以查找所有 blob 的信息(中心、尺寸等)。基本上,图像包含一些噪点、一些粗线,当然还有一些斑点。

调整大小的图片

全尺寸图片 (12Mb)

我的目标是使用图像处理包“Sapera APF”对 FPGA 进行编程。Sapera APF 是用于对 Teledyne DALSA 图像采集卡进行编程以执行图像处理的应用程序。不幸的是它不允许我们以常规方式编写代码,也不允许使用基本的编码功能(if else语句,循环等),而只支持代码块形式的一些内置功能,我们只能安排这些块. 仅供参考,这是 Sapera 支持的功能列表的链接: https ://www.dropbox.com/s/9f5qc9uki0lsalu/sapera_functions.docx

现在我的第一个目标是在 matlab 上测试我的算法,然后在 Sapera 上实现它。这是我在matlab中的方法:

  1. 应用均值滤波器(用于第 3 步)
  2. 使用自适应阈值处理的阈值图像(返回二值图像)
  3. 通过检查连通性删除线,所有线都以超过 100 个像素连接(为了更好的连通性,首先应用均值滤波器)
  4. 现在由于只剩下斑点,因此识别了它们的位置(灰度值=255),并在原始图像中获取了相应的像素。

这是一个简单的算法,在 matlab 中运行良好。但真正的问题是,对于第 2 步(即连通性),我当然必须编写循环到每个像素检查连通性,这在 Sapera 中无法完成。所以我正在寻找一些其他更简单的算法来分离图像中的 blob,而不使用循环和条件语句,以便它可以在 Sapera 中实现,但现在我只需要它的 matlab 代码或算法。

编辑:我无法裁剪出包含斑点的条带,因为其他图像可能包含与斑点非常接近(可能重叠)的线条。例如,https://www.dropbox.com/s/m2j5pqo6stg4s1z/h125_s_-30.bmp

1个回答

由于您有卷积和膨胀,您可以使用高斯斑点检测器的拉普拉斯算子来检测斑点和膨胀以找到中心点。在 MATLAB 中:

sigma = 3;

% Filter image with LoG
I = double(rgb2gray(imread('NCxQ8.jpg')));
h = fspecial('log', sigma*6, sigma);
B = -imfilter(I,h);
imagesc(B); pause;

% Threshold
B(B < 5) = 0;
imagesc(B); pause;

% Dilate then compare to get all 
% local maximum in 3 pixel radius
Bd = imdilate(B,strel('disk',3));
imagesc(Bd); pause;
P = (B == Bd) .* B;
imagesc(P);

% Get point locations
loc = find(P > 0);
fprintf('There are %d blobs\n',numel(loc));

注意:“NCxQ8.jpg”是帖子中嵌入的较小图像。为较大的调整 sigma。