我有一个很长的向量,代表不同的区域。我想从这个向量中识别并分离这些区域。例如,下面给出了所讨论的载体的一小部分样本:
529 534 536 540 543 545 546
Columns 99 through 105
547 548 550 554 557 558 560
Columns 106 through 112
561 562 564 568 570 572 573
Columns 113 through 119
575 576 579 581 582 585 587
Columns 120 through 126
590 596 597 599 600 601 602
Columns 127 through 133
607 609 613 616 618 622 623
Columns 134 through 140
628 637 641 642 643 646 652
Columns 141 through 147
655 658 659 1031 1032 1034 1035
Columns 148 through 154
1044 1045 1046 1049 1051 1053 1060
Columns 155 through 161
1061 1068 1071 1072 1074 1077 1081
Columns 162 through 168
1084 1088 1110 1122 1143 1156 1175
Columns 169 through 175
1182 1191 1193 1195 1197 1200 1201
Columns 176 through 182
1205 1210 1214 1228 1239 1259 1267
Columns 183 through 189
1276 1286 1292 1297 1300 1307 1314
Columns 190 through 196
1318 1319 1321 1325 1337 1353 1362
Columns 197 through 203
1372 1381 1405 1411 1427 1432 1438
Columns 204 through 210
1443 1444 1801 1803 1805 1810 1811
Columns 211 through 217
1812 1815 1818 1822 1824 1825 1826
Columns 218 through 224
1829 1833 1835 1846 1852 1856 1860
以上向量是find
的结果,因此删除了所有零或非兴趣像素。上面的矢量表示如下图:
所以我的想法是,经历大跳跃的矢量索引将代表区域结束和开始。但我似乎无法把它放在编程中。到目前为止,我的尝试是使用循环来检查上面的vecotr并使用差异条件找出像这样的区域
for k = 1:length(ind)-1
if((ind(k+1) - ind(k)) > 100)
reg_2 = ind(k+1)
我将阈值设置为100,如果两个索引之间的差异大于100,则k+1
是下一个区域的开始。但是,我如何衡量第一个区域的开始?每当这个条件成立时,我的reg_2
都不会被覆盖吗?如何避免?
答案 0 :(得分:3)
diff
使用findpeaks
功能。由于我没有你的数据,我只是给了一个原型,但它应该有效。
th=200 %estiamted from the figure posted in the question. Used later.
diffVec=diff(vec);
[peaks,locs]=findpeaks(diffVec,'minpeakheight', th); %user-set threshold.
我认为一旦你有了峰值的位置,那么选择这个区域是微不足道的。
编辑1:我尝试了您发布的数据。阈值为200时,我得到2个峰值,一个在索引52处,另一个在114处。如果我观察数据,则达成一致:
vec(52)=659 & vec(53)=1031
vec(114)=1444 & vec(115)=1801
所以区域是:1到52,53到114和115到结束(即133)。
编辑2:上面的区域是矢量索引而不是矢量值。这些指数中的值可以很容易地提取为:
locs=[[1;locs] [locs;length(a)]];
locs(:,1)=locs(:,1)+1;
regions=[[0;a(locs(2:end,1))] [a(locs(1:end-1,2));max(a)]];