如何从图像矩阵中检测边缘

时间:2018-12-15 10:51:56

标签: matlab image-processing filter edge-detection

我想找到检测给定矩阵边缘的最佳方法,然后在MATLAB上编写算法以检测边缘。

a=[
1   1   1   1   1   1   1   1   1 
1  100 100 100 100 100 100   1   1
1  100 100 100 100 100 100  1   1
1  100 100  1   1  100 100  1  100
1  100 100  1   1  100 100  1   1
1  100 100 100 100 100 100  1   1
1  100 100 100 100 100 100  1   1
1  100 100  1   1   1   1   1   1
1  100 100  1   80  1   1   1   90
]

我尝试过'Sobel','Prewitt','Roberts','log','zerocross'和'Canny'

1 个答案:

答案 0 :(得分:1)

首先,您可以将图像二值化,因为在这种情况下图像似乎是背景图像。一种可能的解决方案是遍历每个元素,如果该元素是图像的一部分,则如果至少一个相邻元素是背景,则将其添加到边缘。

我在下面附加了此操作的代码:

a=[
1   1   1   1   1   1   1   1   1 
1  100 100 100 100 100 100   1   1
1  100 100 100 100 100 100  1   1
1  100 100  1   1  100 100  1  100
1  100 100  1   1  100 100  1   1
1  100 100 100 100 100 100  1   1
1  100 100 100 100 100 100  1   1
1  100 100  1   1   1   1   1   1
1  100 100  1   80  1   1   1   90
];

a(a ~= 1) = 0;
a = ~a;
[x,y] = ind2sub(size(a),find(a));
edges = [];
for i = 1:length(x)
    [nx, ny] = meshgrid(x(i)-1:x(i)+1, y(i)-1:y(i)+1);
    n = [nx(:) ny(:)]; 
    n(n(:,1) == 0 | n(:,1) == size(a,1)+1 | n(:,2) == 0 | n(:,2) == size(a,2)+1,:) = [];
    b = sub2ind(size(a),n(:,1),n(:,2));
    all_neighbors = a(b);
    if ( a(x(i),y(i)) == 1 && sum(all_neighbors) ~= length(all_neighbors))
        edges = [edges sub2ind(size(a),x(i),y(i))];
    end
end