Matlab 从矩阵中减去邻域
好的,所以我想这可能相当容易,但除了零碎的东西,在网上找不到任何好的帮助 我有一个NxN矩阵,我想做一种边缘检测。我想减去所有相邻值的一个因子,如果它们存在的话 因此,如果我的矩阵由Matlab 从矩阵中减去邻域,matlab,Matlab,好的,所以我想这可能相当容易,但除了零碎的东西,在网上找不到任何好的帮助 我有一个NxN矩阵,我想做一种边缘检测。我想减去所有相邻值的一个因子,如果它们存在的话 因此,如果我的矩阵由[5,5,5;5,10,5;5,5,5]组成,我希望它返回[4,3,4;3,8,3;4,3,4](举个例子,这是一个非常粗略的估计) 我可以看到如何使用for循环来实现它,但我认为它可能以一种更简单、更省力的方式实现。到目前为止,nlfilter似乎是一种可能的解决方法,但我似乎无法完全靠自己来解决。您描述的数学运算
[5,5,5;5,10,5;5,5,5]
组成,我希望它返回[4,3,4;3,8,3;4,3,4]
(举个例子,这是一个非常粗略的估计)
我可以看到如何使用for循环来实现它,但我认为它可能以一种更简单、更省力的方式实现。到目前为止,nlfilter似乎是一种可能的解决方法,但我似乎无法完全靠自己来解决。您描述的数学运算称为 卷积基本上相当于将图像中的每个像素替换为自身及其相邻像素的加权和。权重以称为核的矩阵(通常很小)给出,有时称为脉冲响应 对于边缘检测,我建议使用或内核 MATLAB函数可以为您做图像卷积
kernel = [ 0 1 0
1 -4 1
0 1 0 ];
edges = conv2(image,kernel,'same');
你可能在找类似的东西 根据您的示例,
h
类似于
h = [ 0 -0.1 0;
-0.1 1 -0.1;
0 -0.1 0];
这将取中心的值并减去其4个相邻值的1/10。如果使用
filter2(h,X,'same')
,其中X是原始矩阵,它将用零填充,这似乎是您希望获得正确边值的地方。您是如何得到这些结果的?数学运算是什么?你考虑的是8个邻域还是4个邻域?这些结果是通过创建一个3x3矩阵得出的,其中位置2、4、6、8的因子从位置5中减去。这有用吗@比克尼斯+索贝尔和拉普拉斯1。我可能应该提到他们。谢谢!我将尝试这个解决方案;我担心另一个解决方案(使用filter2d)可能会使用已经加权的数字(相同的矩阵)来计算第一个之后的任何值,这是对的吗?不过这个函数返回一个N+2*N+2矩阵。有没有办法解决这个问题(除了创建一个没有这些列和行的新矩阵)?@ades我现在刚刚解决了这个问题——您需要将'same'
参数添加到函数调用中。据我所知,filter2d
和conv2
在这里的使用方式基本相同。我的内核
是烧杯的h
。我认为唯一的区别是conv2
将内核
矩阵左右翻转,然后上下翻转。但是如果内核是对称的,这并不重要,因为它们完全相同,只是因为内核是对称的。使用矩阵[1 2 1;0 0 0;-1-2-1];尝试conv2
和filter2
代码>在任何图像上。结果将得到反映。你会明白我的意思。“相同”
绝对是一个很好的功能。我甚至不知道存在filter2d
。@是的,这取决于你是否自己填充了数组。在这种情况下,我假设不是@但是您要小心使用filter2d
。这实际上是互相关,它将内核旋转180度。你的内核是否对称并不重要,但如果不是对称的话,调试它会让你发疯。冒着混淆的风险,我认为从技术上讲卷积是一个涉及内核翻转的过程,而互相关是保持它不变的过程?不管是哪种情况,都值得指出。我甚至会忘记它的发生,因为大多数图像过滤器都是对称的,就像你说的那样。这是帮助页面中让我困惑的部分,“二维相关相当于二维卷积,滤波器矩阵旋转180度。”这真正意味着互相关相当于根本不旋转内核,而不是旋转两次;)