好的,所以我怀疑这可能相当容易,但除了零碎之外,在网上找不到任何好的帮助。
我有一个NxN矩阵,我想做一些边缘检测。我想减去所有相邻值的因子(如果它们存在)。
因此,如果我的矩阵由[5, 5, 5 ; 5, 10, 5 ; 5, 5, 5]
组成,我希望它返回[4, 3, 4 ; 3, 8, 3 ; 4, 3, 4]
(非常粗略估计只是为了举例)。
我可以看到如何使用for循环,但我认为它可以以更容易和更少的税收方式实现。到目前为止,nlfilter似乎是一种可能的出路,但我似乎无法完全理解它。
答案 0 :(得分:1)
您描述的数学运算称为convolution。
卷积基本上等于用自身及其邻居的加权和替换图像中的每个像素。权重以(通常很小的)矩阵(称为内核)或有时脉冲响应给出。
对于边缘检测,我建议使用Sobel或discrete Laplacian内核。
MATLAB函数conv2
可以为你做图像卷积。
kernel = [ 0 1 0
1 -4 1
0 1 0 ];
edges = conv2(image,kernel,'same');
答案 1 :(得分:1)
您可能正在寻找类似filter2(h,X)
的内容根据您的示例,h
类似于
h = [ 0 -0.1 0;
-0.1 1 -0.1;
0 -0.1 0];
这取值为中心值,减去其4个邻居中的每一个的1/10。如果您使用filter2(h,X,'same')
,其中X是您的原始矩阵,它将使用零填充,这似乎是您想要获得正确的边值。