我的原始数据是(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
答案 0 :(得分:0)
如果您无法使用任何工具箱,那么此解决方案将起作用。以下是它的作用概述
- 从1,1(左上角)
开始浏览整个搜索矩阵(B)- 创建一个B的小子区域,其大小与模式
相同- 对子区域和模式执行XOR,任何不同的像素值为1,它们为零
- 如果XOR中所有元素的总和== 0,那么我们就匹配(没有像素不同)
- 将匹配的左上角坐标添加到输出数组
醇>
所有坐标都是相对于左上角引用的。所以例如
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