在2D数组中搜索2D模式

时间:2015-04-24 13:41:53

标签: arrays matlab search

我的原始数据是(640 x480双)2D阵列,在此图像(来自相机的像素数据)中,我想要检测特定尺寸的某些图案或对象。我想从第2行第2行开始,沿着col和行以1为步长增加以找到具有特定值的像素(即> 1),这表示可能是我要检测的对象的一部分的像素。如果相邻像素等于1(对象的最小尺寸是3 {3阵列1 s并且对象的最大尺寸是100 x 100 1s的数组)那么这是一个可能被检测的对象,例如:

0 0 1 1 1 0 0
1 0 1 1 1 0 0
0 0 1 1 1 1 0 

在上述矩阵中,检测到1粒子(1 s的3×3阵列)

一旦找到了一个粒子,我想总结所有对粒子有贡献的元素值。

我已经开始研究下面的一个简单矩阵了解代码,但是一旦我检测到一个粒子我就不知道怎么把它改成原来的2DArray中的原始double值A。

任何帮助将不胜感激。

    A = magic(20);
    B = A>=300;
    pattern = [1,1];
    Cind = cell(1,20);
    Dind = cell(1,18);

    for r= 1:20

         Cind{r} = strfind(B(r,:),pattern);

    end

    for n= 1:18

         Dind{n} = isequal(Cind(1,n), Cind(1,n+1));

         if isempty(Cind{n})
            Dind{n}=0;
         end

     end

1 个答案:

答案 0 :(得分:0)

如果您无法使用任何工具箱,那么此解决方案将起作用。以下是它的作用概述

  
      
  1. 从1,1(左上角)
  2. 开始浏览整个搜索矩阵(B)   
  3. 创建一个B的小子区域,其大小与模式
  4. 相同   
  5. 对子区域和模式执行XOR,任何不同的像素值为1,它们为零
  6.   
  7. 如果XOR中所有元素的总和== 0,那么我们就匹配(没有像素不同)
  8.   
  9. 将匹配的左上角坐标添加到输出数组
  10.   

所有坐标都是相对于左上角引用的。所以例如

B=[0 1 0 0;
   0 1 1 1;
   0 1 1 1;
   0 1 0 1];
pattern = [1 1;
           1 1];

然后输出

 matching_regions =
     2     2
     2     3

意味着比赛的左上角位于(2,2)。但需要注意的是匹配区域可以重叠。 (2,3)也匹配我们的模式,但与(2,2)处的匹配重叠。我不认为这是一个问题,但需要注意的事项。

此功能适用于任何小于搜索区域的模式。搜索区域和模式都必须是逻辑数组(只有0和1或者是真和假)

A = magic(20);
B = A>=300; % this is a MxN array
[M,N] = size(B);

%% put your pattern here
%creates a 2,2 pattern of ones
pattern = ones(2,2);

%% do not change this code
[pat_r,pat_c] = size(pattern);

%this aray with old the upper left (row,column) of a pattern match
matching_regions = [];

%go over all rows without running off cells
for r = 1:1:M-pat_r+1
    %go over all cols without running off cells. since our search 
    %regions are square the limits are the same
   for c = 1:1:N-pat_c+1

       %grabs the pixels centered around (r,c) where r,c is the upper left
       %corner of the region
       search_region = B(r:r+pat_r-1, c:c+pat_c-1);

       %if all the pixels match
       if (nnz(xor(pattern, search_region)) == 0)
           %appends new row to table of matches
            matching_regions = [matching_regions; [r,c]];
       end
   end
end