Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
|
![]() |
#1 |
高级会员
注册日期: 2019-11-21
帖子: 3,006
声望力: 66 ![]() |
![]()
我无法弄清楚研究的最后一部分,所以如果有人可以帮助我,我将非常感谢您的帮助.. :)
说我的原始矩阵是 X = 0 0 0 0 0 0 0 12 9 0 0 4 9 15 0 0 11 19 0 0 0 2 4 8 0 0 4 5 8 0 0 0 0 0 0 找到非零的平均值后,我将得到如下所示的结果: new_x = 0 0 0 0 0 0 0 **9.0000** 9.0000 0 0 4.0000 9.0000 **9.0000** 0 0 **8.3333** **8.0000** 0 0 0 2.0000 4.0000 8.0000 0 0 4.0000 5.0000 8.0000 0 0 0 0 0 0 请注意,任何大于10的元素都是“中心”,我们希望找到半径为1 m的非零值的平均值。其中1米=距中心1个元素。 **表示中心。 对于这一部分,我使用了以下内容(来自gnovice ): X=[0 0 0 0 0; 0 0 12 9 0; 0 4 9 15 0; 0 11 19 0 0; 0 2 4 8 0; 0 4 5 8 0; 0 0 0 0 0]; kernel=[0 1 0; 1 0 1; 0 1 0]; sumx=conv2(X,kernel,'same'); nx=conv2(double(X>0),kernel,'same'); index=(X>10); new_x=X; new_x(index)=sumx(index)./max(nx(index),1); 所以我的问题是,我想比较相邻元素与其中心是否相等,较小或较大。如果大于或等于1,则为'0',否则将忽略半径之外的任何元素并将其替换为'0'。 例如,中间的9位于12、15和19个中心的半径内,因此取那些min [9.000,9.000,8.000] = 8.000的最小中心 。在这种情况下,将不考虑4,因为在最后两行中它不被称为“中心”,也没有被称为[8 4 5和8]。 所以我想要类似下面的东西: Test_x = 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 我之前已经将这个第一部分放在论坛中,对于之前的每个建议,我都感到非常感谢。 请先给我一些想法。我已经尝试过使用循环,但是它似乎没有很好地工作。任何可以为我完成工作的MATLAB函数。 非常感谢你的帮助。 MATLAB初学者 我想我通过使用乔纳斯(Jonas)技术找到了这个问题的解决方案。谢谢您的帮助Jonas和gnovie :) avg_x =X = [0 0 0 0 0; 0 0 12 9 0; 0 4 9 15 0; 0 11 19 0 0; 0 2 4 8 0; 0 4 5 8 0; 0 0 0 0 0]; 0 0 0 0 0 0 0 9.0000 0 0 0 0 0 9.0000 0 0 8.3333 8.0000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 回答:tmp_x = avg_x; 我认为您想要做的是基于new_x创建一个新数组,该数组将每个元素替换为其最小的4个相连的邻居。然后,您可以将新数组与new_x进行比较。 这是一种方法(需要图像处理工具箱) tmp_x = new_x; maxVal = max(new_x(:))+1; tmp_x(tmp_x == 0) = maxVal; %# replace all the zeros in tmp_x with something large tmp_x = imerode(tmp_x,kernel); %# kernel is the same as in the OP Test_x = new_x >= tmp_x; %# put ones wherever the value is %# greater or equal the neighbour's minimum %# only keep 1's that are next to 'centers' Test_x = Test_x .* imdilate(X>10,strel('disk',1)) Test_x = 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 请注意,与您相比,使用这种逻辑我得到的更多。 更多&回答... |
![]() |
![]() |