zoukankan      html  css  js  c++  java
  • Matlab图像处理学习笔记(四):多边形检测

        本文用matlab实现了基本多边形的检测、提取。

        本文涉及到的知识点如下:

         1、Canny边缘检测。 bw = edge(gray,'canny',[0 , 50/256]);

         2、细化操作。 im=bwmorph(image,'thin',Inf);

         3、边界追踪。 edgelist=bwboundaries(im);

         4、边界的多边形近似。 linefit_Prasad_RDP_opt(edgelist);

        本文算法思路借鉴了Nash的博客,地址:http://opencv-code.com/tutorials/detecting-simple-shapes-in-an-image/点击打开链接

          边界的多边形近似算法为:Douglas-Peucker algorithm,算法的matlab实现我引用了Dilip K. Prasad分享的文件。本文所有操作的理论基础均可在冈萨雷斯的《数字图像处理》中找到答案。

       Douglas-Peucker algorithm地址:https://docs.google.com/file/d/0B10RxHxW3I92dG9SU0pNMV84alk/edit?pli=1点击打开链接

    算法实现过程可分为以下几步。

    1、提取边缘。

    2、进行形态学处理,分割图像。

    3、进行细化操作,减小计算量。

    4、用多边形近似边界。

    5、判断该顶点是否有效。(根据相邻顶点之间的距离)

    转载请注明出处:http://blog.csdn.net/u010278305

    下面给出源代码:

    %function:
    %       基于最小距离分类器的模板匹配
    %       寻找图片中与已知模板的匹配区域
    %       程序中调用了Dilip K. Prasad对Ramer–Douglas–Peucker algorithm的matlab实现
    %referrence:
    %      思路借鉴:http://opencv-code.com/tutorials/detecting-simple-shapes-in-an-image/
    %      Ramer–Douglas–Peucker algorithm:http://en.wikipedia.org/wiki/Ramer%E2%80%93Douglas%E2%80%93Peucker_algorithm
    %date:2015-1-10
    %author:chenyanan
    %转载请注明出处:http://blog.csdn.net/u010278305
    
    %清空变量,读取图像
    clear;close all
    src = imread('basic_shapes.png');
    
    figure('name','原始图像'),
    imshow(src),title('src'),
    
    %Convert to grayscale
    gray=rgb2gray(src); gray = im2double(gray);
    
    %Convert to binary image using Canny 
    bw = edge(gray,'canny',[0 , 50/256]);
    
    %dilate
    dilateElement=strel('square', 5);
    bw=imdilate(bw, dilateElement);
    
    %提取每个连通区域
    stats = regionprops(bw, 'Image');
    statssize= numel(stats);
    plotsize=ceil(sqrt(statssize));
    figure('name','分离结果'),
    num=zeros(statssize,1);
    %算法核心
    for i=1:statssize
        image=stats(i).Image;
        %进行细化操作
        im=bwmorph(image,'thin',Inf);
        % getting the edge data. 
        edgelist=bwboundaries(im);edgelist=edgelist.';
        % calling linefit_Prasad_RDP_opt
        [edgelist,seglist,precision_list,reliability_list,precision_edge,reliability_edge, time_edge] = linefit_Prasad_RDP_opt(edgelist);
        boundnum=length(seglist{1}(:,:));
        bound=0;
        sizepic=sum(size(im));
        %判断每个顶点之间的间距是否符合要求
        for j=1:boundnum-1
            cornerdiff=seglist{1}(j,:)-seglist{1}(j+1,:);
            cornerdiff=sqrt(sum(cornerdiff.^2));
            if(cornerdiff>0.09*sizepic)
                bound=bound+1;
            end
        end
        num(i)=bound;
        %进行绘图并标识
        subplot(plotsize,plotsize,i);imshow(image),
        if bound<7
            title(bound);
        else
            title('圆');
        end
    end
    
    
     

    运行效果如下:



    源图像已上传:



  • 相关阅读:
    [原创]全新IFPGA-Cable----支持Xilinx/Altera/Lattice JTAG和UART
    [原创]Modelsim后仿真
    [原创]iFPGA-USB2.0 FT2232H USB & UART开发板使用说明
    [原创]X-HDL 4.2安装与使用
    [原创][Synth 8-2543] port connections cannot be mixed ordered and named ["*_Top.v":1151]
    [原创]..OBJgpio.axf: error: L6002U: Could not open file ..objgpio.o: No such file
    [原创]Zynq SDIO WIFI SotfAP调试
    [原创]时序图新画法
    [原创]基于Zynq SDIO WIFI 2.4G/5G SotfAP STA
    [原创]Zynq AXI-CDMA的使用
  • 原文地址:https://www.cnblogs.com/chenyn2014/p/4220200.html
Copyright © 2011-2022 走看看