寻找峰值MATLAB

时间:2014-12-11 21:39:45

标签: matlab image-processing signal-processing

我有一个向量,它包含图像一行中的灰度级像素。 vec=IM(:,65); 我展示了我想要检测的数组部分。这些部件将是我的目标' piksels。

如何检测这些物体像素?

vec的情节: enter image description here 矢量在这里: vec

2 个答案:

答案 0 :(得分:4)

使用信号处理工具箱中的findpeaks可以很容易地解决这个问题。具体来说,对于您的数据,我必须这样称呼它:

[pks, locs] = findpeaks(max(vec)-vec, 'minpeakdistance', 160, 'minpeakheight', 22);

findpeaks仅找到正峰值(局部最大值)。因此,我们需要做的是将其反转,以便所有局部最小值成为局部最大值。我通过获取向量的最大值并用向量减去来做到这一点。因为有很多局部峰,minpeakdistance字段允许您在每个峰之间找到至少相隔很多的峰。我将此调整为160.此外,最小峰高会发现大于某个数字的峰值,我将其调整为22. pks找到实际的峰值,locs为您提供信号中的峰值。我们需要使用locs来查找实际的峰值数据,因为我们在信号的镜像反射版本上执行此操作。因此,要获得实际的峰值数据,请执行以下操作:

pks_final = vecs(loc);

作为演示,让我们绘制此信号以及findpeaks所定位的峰值:

plot(1:numel(vec), vec, locs, vec(locs), 'r.');

原始数据以蓝色绘制,而检测到的峰以红色绘制。这就是我得到的:

enter image description here


祝你好运!

答案 1 :(得分:3)

有不同的方法可以找到局部峰值,这里我使用偏离局部平均值,然后分离区域,并扫描每个区域最小。

clear
close all

load a

std_a=std( a(a~=0) );

SMOOTH_SIZE=131;% depend on data size
THRESHOLD=0.7*std_a;

smooth_a = conv(a,ones(SMOOTH_SIZE,1)/SMOOTH_SIZE,'same'); %ma filter

deviation_a=a-smooth_a; 
negdev_a=deviation_a.*(deviation_a<-THRESHOLD); %deviation in negative region (minimum)

negdev_a_left=[negdev_a(2:end) 0]; % helper to find starting index point
negdev_a_right=[0 negdev_a(1:end-1)]; % helper to find end index point

negdev_a(1)=0; negdev_a(end)=0; % make sure that we have zero point
indfrom=find(negdev_a==0 & negdev_a_left~=0); %start index per region
indto=find(negdev_a==0 & negdev_a_right~=0); %start index per region

if(length(indfrom)~=length(indto)), error('error in regions');end

peak_indexes=zeros(1,length(indfrom)); %number of regions
peak_counter = 0;

for i=1:length(indfrom)
  [center_min, min_idx]=min( a( indfrom(i):indto(i) ) );
  real_min_idx=indfrom(i)-1+min_idx; % convert back to original array index
  if( real_min_idx==indfrom(i) || real_min_idx==indto(i) ), continue; end
  left_max=max(a( indfrom(i):real_min_idx-1)); %helper to check for real minimum
  right_max=max(a( real_min_idx+1:indto(i)));  %helper to check for real minimum

  if(center_min<left_max && center_min<right_max) % check if this is real minimum
       peak_counter=peak_counter+1;
       peak_indexes(peak_counter)=real_min_idx;
  end
     % if you need subpixel accuracy you can do some weighted average in the min region
end
peak_indexes=peak_indexes(1:peak_counter); %narrow to found indexes

figure; plot(a); hold on; plot(smooth_a, 'k'); hold off;
figure; plot(deviation_a);hold on;  plot(negdev_a,'r.');hold off;
figure; plot(a);hold on; plot(peak_indexes, a(peak_indexes),'rO');hold off; %result

Result 希望这有帮助, 门迪