如何从向量中提取区域?

时间:2014-03-19 20:23:22

标签: image matlab vector matrix

我有一个很长的向量,代表不同的区域。我想从这个向量中识别并分离这些区域。例如,下面给出了所讨论的载体的一小部分样本:

 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的结果,因此删除了所有零或非兴趣像素。上面的矢量表示如下图:

enter image description here

所以我的想法是,经历大跳跃的矢量索引将代表区域结束和开始。但我似乎无法把它放在编程中。到目前为止,我的尝试是使用循环来检查上面的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都不会被覆盖吗?如何避免?

1 个答案:

答案 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)]];