利用LBP算子结合SVM提取建筑物(四)

本文介绍了如何使用Matlab中的SVM接口进行二分类模型的构建,特别是针对建筑物信息的提取。通过选择背景和目标训练数据,建立支持向量机模型,然后对图像进行分类和目标提取,计算分类精度。
摘要由CSDN通过智能技术生成

四、SVM提取建筑物信息


想要一个人独立实现SVM机器学习算法还是有一定的难度的,涉及的知识点比较多,SVM的公式推导过程也是一些大公司的面试题,这里懂得SVM的实现原理就ok了,这里就直接调用matlab里的SVM接口吧,QAQ。


这里利用的SVM(支持向量机)是一种二分类(还有多分类的)模型,其基本原理可以简单描述为:找到一个超平面,将数据集分成两类,使得距离最近的非同类点的距离最大。其最重要的环节就是,寻找支持向量(离超平面最近的点)以确定超平面,从而把数据可以分类成两个类别。在二分类的处理中,超平面的选择就是一条直线,但是很多数据都不能用一个简单的直线进行划分两个类别,这时候就需要通过核函数的处理,将数据映射到更高维的空间,便于SVM能通过一条直线(超平面)进行二分类。通过训练数据的选取,进行SVM训练,得到相应的模型,再进行预测得到相应的精度。在精度合理之后即可进行完整模型的生成,提取出相应的建筑物信息。

部分代码片段:

msgbox(strcat('请选择',num2str(edit2_text_value/2),'个背景训练数据'),'目标样','help');
    figure;imshow(RGB_image);
    for i=1:edit2_text_value/2
        if h>=5000
            pause;
        end
        [x,y]=ginput(1);
        x=floor(x);
        y=floor(y);
        hold on;
        plot(x,y,'r*');
        TrainData_background(i,:)=RGB_image(y,x,:);%第i行的所有列
        accuracy(i,1)=x;
        accuracy(i,2)=y;
        %LBP_TrainData_background(i,:)=LBP_image(y,x,:);
    end
    %% 选取目标训练数据
    msgbox(strcat('请选择',num2str(edit2_text_value/2),'个目标数据'),'目标样','help');
    pause;%按任意键进行
    for i=1:edit2_text_value/2
        if h>=5000
            pause;
        end
        [x,y]=ginput(1);
        x=floor(x);
        y=floor(y);
        hold on
        plot(x,y,'b*');
        TrainData_foreground(i,:)=RGB_image(y,x,:);%数组的前两个参数是行和列,图像的是坐标x和y
        %LBP_TrainData_foreground(i,:)=LBP_image(y,x,:);
        accuracy(i+edit2_text_value/2,1)=x;
        accuracy(i+edit2_text_value/2,2)=y;
    end
    
    %% 整合训练数据和标号数据
      TrainData=[TrainData_background;TrainData_foreground];
      %train_data=TrainData;             %用于输出训练数据
      %LBP_TrainData=[LBP_TrainData_background;LBP_TrainData_foreground];
      %按列向量的形式加入原来的TrainData后
      %TrainData=horzcat(TrainData,LBP_TrainData);
      %length(TrainData_background)%找出维数长度的最大值
      text_str=write("----------------------------------------------------------------------------");
      text_str=write("训练数据:");
      for i=1:edit2_text_value
          text_str=write(strcat(num2str(TrainData(i,1))," ",num2str(TrainData(i,2))," ",num2str(TrainData(i,3))));
          if i==edit2_text_value/2
              text_str=write("------------------------------以下为目标数据------------------------------");
          end
      end
      text_str=write("----------------------------------------------------------------------------");
    end
      TrainLabel=[zeros(length(TrainData)/2,1);ones(length(TrainData)/2,1)];
      %LBP_TrainLabel=[zeros(length(LBP_TrainData_background),1);ones(length(LBP_TrainData_foreground),1)];
      %训练支持向量积
      model=fitcsvm(TrainData,TrainLabel);
      %LBP_model=fitcsvm(LBP_TrainData,LBP_TrainLabel);
      %%训练数据预测分类
      preTrainLabel=predict(model,TrainData);
      %LBP_preTrainLabel=predict(LBP_model,LBP_TrainData);
      num=sum(preTrainLabel == TrainLabel);
      %LBP_num=sum(LBP_preTrainLabel == LBP_TrainLabel);
      p_num=num/length(TrainLabel)*100;
      %LBP_p_num=LBP_num/length(LBP_TrainLabel)*100;
      %% 图像分类
      [m,n,k]=size(RGB_image);  
      TestData=reshape(RGB_image,m*n,k);
      %[m1,n1,k1]=size(LBP_image);
      %LBP_TestData=reshape(LBP_image,m1*n1,1);
      %TestData=horzcat(TestData,LBP_TestData);
      TestData=double(TestData);
      %LBP_TestData=double(LBP_TestData);
      TestLabel=predict(model,TestData);%二分类的结果也就0或1
      %LBP_TestLabel=predict(LBP_model,LBP_TestData);
      %二值分类结果
      img_seg=reshape(TestLabel,m,n);
      %LBP_img_seg=reshape(LBP_TestLabel,m1,n1);
      figure;imshow(img_seg);
      %figure;imshow(LBP_img_seg);       %背景数据二值分类结果
      %% 目标提取结果
      %ind=repmat(img_seg,1,1,k);        %复制K次(深度)
      pic_seg=RGB_image;
      global Build_number;
      for i=1:n
          for j=1:m
              if img_seg(j,i)==0
                  pic_seg(j,i,:)=0;
              else
                  Build_number=Build_number+1;
              end
              
          end
      end
      text_str=write(strcat("建筑物面积:",num2str(Build_number)));
%pic_seg(~ind)=0;                  %非目标数据灰度值设为0
      %LBP_pic_seg=LBP_image;
      %LBP_background=int16(LBP_img_seg);
      %LBP_pic_seg(~LBP_background)=0;
%       for i=1:n1
%           for j=1:m1
%               if LBP_background(j,i)==0
%                   LBP_pic_seg(j,i)=0;
%               end
%           end
%       end
      figure;imshow(pic_seg);
      imshow(pic_seg,'Parent',handles.axes1)
      Build_image=pic_seg;
      RGB_count=0;
      if accuracy(:,1)~=0
          for i=1:edit2_text_value
              if img_seg(accuracy(i,2),accuracy(i,1))==0 && i<edit2_text_value/2+1
                  RGB_count=RGB_count+1;
              end
              if img_seg(accuracy(i,2),accuracy(i,1))==1 && i>=edit2_text_value/2+1
                  RGB_count=RGB_count+1;
              end
          end
      else
           for k=1:length(TrainData)
               label=0;
              for i=1:n
                  for j=1:m
                        if (TrainData(k,1)==RGB_image(j,i,1)) && (TrainData(k,2)==RGB_image(j,i,2)) &&(TrainData(k,3)==RGB_image(j,i,3)) &&img_seg(j,i)==0 && k<length(TrainData)/2+1
                            RGB_count=RGB_count+1;
                            label=1;
                            break;
                        end
                        if (TrainData(k,1)==RGB_image(j,i,1)) && (TrainData(k,2)==RGB_image(j,i,2)) &&(TrainData(k,3)==RGB_image(j,i,3)) &&img_seg(j,i)==1 && k>=length(TrainData)/2+1
                            RGB_count=RGB_count+1;
                            label=1;
                            break;
                        end
                  end
                  if label==1
                      break;
                  end
              end
           end
      end          
      RGB_accuracy=RGB_count/length(TrainData)*100;
      text_str=write(strcat("分类精度为:",num2str(RGB_accuracy),"%"));
      %figure;imshow(LBP_pic_seg);
      %LBP纹理图像对应的彩色图像结果
%       LBP_RGB=RGB_image;
%       %LBP_RGB_count=0;
%       for i=1:n1
%           for j=1:m1
%             if LBP_pic_seg(j,i)==0
%                LBP_RGB(j,i,:)=0;
%             end
%           end
%       end
%       figure;imshow(LBP_RGB);
      figure;  
  %% 显示提取结果
      subplot(1,3,1);imshow(RGB_image);
      subplot(1,3,2);imshow(img_seg);
      subplot(1,3,3);imshow(Build_image);

 需要完整代码的童鞋,关注我私聊哈。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值