一维曲线极值检测

 

二维存储的一维曲线极值检测程序

clc;clear;close all;
BW1 = imread('BW1.BMP');
figure,imshow(BW1,[]);

% 提取图像中的曲线
[M,N] = size(BW1);
x=[];y=[];
j=1;
while j<=N,
    for i = 1 : M
     try
        if BW1(i, j) == 1
          x = [x, N - j]; %#ok<*AGROW>
          y = [y, M - i];
          j=j+1;
          break;
        end
     catch
        fprintf(1,'%d, %d\n',i,j);
     end
    end
end


xx = max(x) : -0.1 : min(x);
yy = interp1(x, y, xx, 'linear'); % 一维数据插值cublic
x = xx;
y = yy;
N = size(y, 2);
y(N) = y(N - 1) + 1;
left = 1;
right = 0;
Sk = 0; % 0:斜率未知,1:上升,-1:下降
peak = [];

for j = 2 : N,
    if Sk == 0
        if (y(j) <= y(j - 1))
            Sk = 0;          % 下降及保持信号、初始信号
            continue;
        else
            Sk = 1;          % 上升信号
            left = j;
            continue;
        end;
    end;
    
    if (Sk == 1)
        if (y(j) < y(j - 1))
            Sk = -1;         % 下降信号
            continue;
        end       
    else if (Sk == -1)
            if (y(j) < y(j - 1))
                right = j;
            end;
            if (y(j) > y(j - 1))
                Sk = 0;
                disp([left, right]);
                peak = [peak; left, right];
                continue;
            end           
        end     
    end
    
    if Sk == 0
        if (y(j) <= y(j - 1))
            Sk = 0;
            continue;
        end;
        if (y(j) > y(j - 1))
            Sk = 1;
            left = j;
            continue;
        end;
    end;    
end;

% 画出峰值
figure,
plot(y);
hold on;
[M,N] = size(peak);
for j = 1 : M
    minP = min(peak(j, 1), peak(j, 2));
    maxP = max(peak(j, 1), peak(j, 2));
    [C, I] = max(y(minP : maxP));
    plot([minP + I, minP + I], [0, C], 'g');
end;

 

 

 

 

参考, pund, getMultiPeak.m

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值