我有一个向量,它包含图像一行中的灰度级像素。 vec=IM(:,65);
我展示了我想要检测的数组部分。这些部件将是我的目标' piksels。
如何检测这些物体像素?
vec的情节: 矢量在这里: vec
答案 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.');
原始数据以蓝色绘制,而检测到的峰以红色绘制。这就是我得到的:
答案 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
希望这有帮助, 门迪