Matlab 在矩阵中找到十字的最快方法

Matlab 在矩阵中找到十字的最快方法,matlab,Matlab,定义: A(i,j)=1是十字的中点,如果元素 A(i-1,j)=1 A(i+1,j)=1 A(i,j+1)=1 A(i,j-1)=1 元素和中点一起在矩阵a中形成一个十字,其中a至少是一个3×3矩阵,i,j∈ ℕ\{0} 假设上面的图像是自然数为1,2,3的8乘8矩阵A。。。作为元素。根据该定义,矩阵总共有3个交叉点。十字架的中点在A(2,2)、A(5,4)和A(5,5)上 我想做的是写一个函数,找到矩阵a中的交叉数。我有一个想法,但我不确定它是否是最佳的。下面是它的伪代码: ITERATE


定义:
A(i,j)=1是十字的中点,如果元素
A(i-1,j)=1
A(i+1,j)=1
A(i,j+1)=1
A(i,j-1)=1
元素和中点一起在矩阵a中形成一个十字,其中a至少是一个3×3矩阵,i,j∈ ℕ\{0}


假设上面的图像是自然数为1,2,3的8乘8矩阵A。。。作为元素。根据该定义,矩阵总共有3个交叉点。十字架的中点在A(2,2)、A(5,4)和A(5,5)上

我想做的是写一个函数,找到矩阵a中的交叉数。我有一个想法,但我不确定它是否是最佳的。下面是它的伪代码:

ITERATE FROM row 2 TO row 7
    ITERATE FROM column 1 TO column 8
        IF current element contains 1
            INCREMENT xcount by 1
            IF xcount >= 3
                CHECK IF counted 1:s is part of a cross
        ELSE IF xcount IS NOT 0
            SET xcount to 0
其思想是迭代从第2行到第7行的每一列。如果我在同一行上发现3个连续的1:s,我会立即检查1:s是否属于十字架。这应该是可行的,但是想象一下有一个非常大的矩阵a——在这种情况下,这段代码的效率有多高?这个问题不能用向量表示法解决吗


非常感谢您的回答。提前谢谢

目前不在matlab附近,但我会这么做。假设
A
是二进制的(只有0'A和1's):

因此,您基本上使用“最小”(标准化)交叉(
crs
)进行卷积,并使用
max
查找峰值
x
y
是交叉位置的坐标。无需用于循环,只需内置(且速度相当快)2d卷积和
max
函数

阈值条件
C>0.9
,只是为了说明需要一个阈值,该阈值由
crs
的强度加权。在这种情况下,我在colvolution行(
crs/sum(crs(:)
)中规范化了
crs
),因此如果
A
是一个二进制矩阵,如示例中所示,您会发现最小规范化交叉的卷积将保留交叉位于
1
的像素值,而其他像素将小于1(这就是我任意选择0.9的原因)。因此,如果阈值始终是二进制的,则可以将其替换为
C==1

另一种可视化十字位置的方法是只查看
C.*(C==1)
。这将生成一个大小为
a
的矩阵,其中
1
s仅在十字所在的位置

编辑:

对于最大速度,你可以考虑把它写为一个内衬,例如:

[x y]=find(conv2(A,[0 1 0 ; 1 1 1 ; 0 1 0]./5,'same')==1); 
使用位掩码:

ux = [false(size(A,1),1) (A(:,3:end) & A(:,2:end-1) & A(:,1:end-2)) false(size(A,1),1)]
uy = [false(1,size(A,2)); (A(3:end,:) & A(2:end-1,:) & A(1:end-2,:)); false(1, size(A,2))]
u = ux & uy
[x y] = find(u)

打败我!我会用
==nnz(crs)
替换
>0.9
,理论上,如果
crs
被规范化,它应该是
==1
,这就是为什么过滤器是
crs./sum(crs(:)
,我只是不确定
A
是否始终是二进制的等等…哦,我没有看到你在规范化
crs
。很抱歉我的回复太晚。我意识到我的问题没有正确表述。我已经更新了这个问题。我希望这不会改变你建议的解决方案。谢谢!@user1497133:关于你的问题日期问题,这个答案正是您想要的。对于十字要求对角邻域为零的替代方案,需要从
crs=[-11-1;11;-11-1];
开始。您没有真正定义十字是什么。是否
one(3,4)
包含两个交叉点?谢谢你提醒我。我添加了一个定义。一个(3,4)包含两个交叉点。当然,对于二进制过滤器的特殊情况,如“交叉点”,逻辑条件可以正常工作,可能更快+1
ux = [false(size(A,1),1) (A(:,3:end) & A(:,2:end-1) & A(:,1:end-2)) false(size(A,1),1)]
uy = [false(1,size(A,2)); (A(3:end,:) & A(2:end-1,:) & A(1:end-2,:)); false(1, size(A,2))]
u = ux & uy
[x y] = find(u)