zoukankan      html  css  js  c++  java
  • 基础大概回顾

    基础大概回顾


    参考文献:Matlab GUI设计入门与实战


    1.一维数据插值

    interp1()函数,用于一维插值,其常用的插值方式如下:

    1.1 nearest(最邻近插值)

    在插值节点的近邻区域内取函数值,该插值函数是一个阶梯函数,即:

    %% nearest
    clc,clear,close all  % 清理命令区、清理工作区、关闭显示图形
    warning off       % 消除警告
    feature jit off      % 加速代码运行
    x = [1:10];
    y = [1, 1, 7, 4, 0, 6, 3, 0, 8, 7];
    figure('color',[1,1,1])
    hold on
    plot(x,y,'o--','linewidth',2)  % 原数图形
    xi = 1:0.1:10;
    yi = interp1(x,y,xi,'nearest');
    hold on
    grid on
    plot(xi,yi,'r*--','linewidth',2)  % 原数图形
    xlabel('x');  ylabel('y');  
    legend('原始数据','nearest插值')
    

    1.2 linear(分段线性插值)

    在每个小区间上采用简单的线性插值,在实际计算中,处理速度快,但是对海量数据本身以及非线性问题,处理误差大,线性插值获得的曲线不够平滑。

    x = [1:10];
    y = [1, 1, 7, 4, 0, 6, 3, 0, 8, 7];
    xi = 1:0.1:10;
    yi = interp1(x,y,xi);
    

    1.3 spline(三次样条插值)

    在每个分段内构造一个三次多项式,使其插值函数满足插值条件外,还要求每个节点处有光滑的条件(导数存在)。

    x = [1:10];
    y = [1, 1, 7, 4, 0, 6, 3, 0, 8, 7];
    xi = 1:0.1:10;
    yi = interp1(x,y,xi,'spline');
    

    1.4 pchip(分段立方插值)

    将插值的数据分段,针对每一段采用立方插值的方法进行拟合逼近

    x = [1:10];
    y = [1, 1, 7, 4, 0, 6, 3, 0, 8, 7];
    xi = 1:0.1:10;
    yi = interp1(x,y,xi,'pchip');
    

    1.5 cubic(立方插值)

    精度较高,插值曲线较平滑。

    x = [1:10];
    y = [1, 1, 7, 4, 0, 6, 3, 0, 8, 7];
    xi = 1:0.1:10;
    yi = interp1(x,y,xi,'cubic');
    

    2.二维数据插值

    griddata根据数据表[x,y,z],用不同的算法计算[xi,yi]各点上的函数近似值zi。

    2.1 nearest(最近邻值)

    x = [1:10];
    y = [0, 0, 1, 1, 3, 4, 6, 7, 7, 8];
    z = [8, 2, 8, 0, 3, 7, 8, 2, 4, 1];
    Z = z'*ones(1,length(x));
    xi = min(x):(max(x)-min(x))/50:max(x);  % 插值数据
    yi = min(y):(max(y)-min(y))/50:max(y);  % 插值数据
    yi = yi'; % 转置
    Zi = griddata(x,y,Z,xi,yi,'nearest');   % 插值
    mesh(xi,yi,Zi)
    

    2.2 linear(线性插值)

    Zi = griddata(x,y,Z,xi,yi,'linear');   % 插值
    

    2.3 cubic插值

    Zi = griddata(x,y,Z,xi,yi,'cubic');   % 插值
    

    3.数据拟合

    3.1 多项式最小二乘法

    最小二次法拟合函数ployfit()

    x = [1:10];
    y = [8, 2, 8, 0, 3, 7, 8, 2, 4, 1];
    p = polyfit(x,y,7); % 7次多项式
    yc = p(1)*x.^7 + p(2)*x.^6+ p(3)*x.^5 + p(4)*x.^4 + p(5)*x.^3 + p(6)*x.^2 +...
    p(7)*x.^1 + p(8)*x.^0;
    

    3.2非线性拟合

    函数lsqcurvefit()

    4.选定区域处理

    4.1 roicolor()函数

    根据颜色选定区域,BW=roicolor(A,low,high),色图范围[low,high],返回这些像素选择区域。BW为内部值为1,外边为0的矩阵

    obj=imread('ps.png');
    obj=rgb2gray(obj);
    load woman;          % 加载MATALB自带图像对应的MAP值
    BW=roicolor(obj,120,200); %抠图
    figure,imshow(obj,map);
    figure,imshow(BW);
    
    

    4.2 roipoly函数

    roipoly(I),为图像I生成交互式的处理界面;
    roipoly(I,c,r),用向量c,r指定多边形的各点坐标。

    obj=imread('psb.png');
    r=obj(:,:,1);
    g=obj(:,:,2);
    b=obj(:,:,3);
    c=[314 272 199 135 175 276];  %横坐标
    r1=[163,268,276,171,43,32];   %纵坐标
    BW=roipoly(obj,c,r1);         %抠图
    r1=immultiply(r,BW);          %交运算
    g1=immultiply(g,BW);
    b1=immultiply(b,BW);
    obj2=cat(3,r1,g1,b1);         %合成RGB图像
    subplot(121),imshow(obj);
    subplot(122),imshow(obj2);
    
    
  • 相关阅读:
    Git 远程分支的查看及相关问题
    Clean Code – Chapter 6 Objects and Data Structures
    Clean Code – Chapter 5 Formatting
    Clean Code – Chapter 4: Comments
    利用 SerialPort 控件实现 PC 串口通信
    Clean Code – Chapter 3: Functions
    oracle如何查看当前有哪些用户连接到数据库
    c++ Ansi和Unicode相互转换
    c++ Utf8和Unicode相互转换
    c++ 根据某个字符或者字符串分割另外一个字符串
  • 原文地址:https://www.cnblogs.com/boyiliushui/p/7743844.html
Copyright © 2011-2022 走看看