• 基于队列的图元识别


    数字化图像是一个m×m 的像素矩阵。在单色图像中,每个像素的值要么为0,要么为1,值为0的像素表示图像的背景,而值为1的像素则表示图元上的一个点,我们称其为图元像素。如果一个像素在另一个像素的左侧、上部、右侧或下部,则称这两个像素为相邻像素。识别图元就是对图元像素进行标记,当且仅当两个像素属于同一图元时,它们的标号相同。

     
    queue.h-----------------------------
    #include<iostream>
    struct location
    {
        int x;
        int y;
    };
    struct Node
    {
        location data;
        Node* t; 
    };
    class LinkedQueue {
        // FIFO对象
    public:
        LinkedQueue() {front = rear = NULL;} // 构造函数
        ~LinkedQueue(); // 析构函数
        bool IsEmpty() const
        {return ((front) ? false : true);}
        void Add(const location);
        void Delete(location& x);
    
        Node *front; // 指向第一个节点
        Node *rear; //指向最后一个节点
    } ;
    
    LinkedQueue::~LinkedQueue()
    {
        while(front!=NULL)
        {
            Node* m=front;
            front=front->t;
            delete m;
        }
    }
    
    void LinkedQueue::Add(const location x)
    {
        if (IsEmpty())
        {
            front=new Node;
            front->data=x;
            front->t=NULL;
            rear=front;
        }
        else
        {
            Node* p=new Node;
            p->data=x;
            p->t=NULL;
            rear->t=p;
            rear=p;
        }
    
    }
    
    void LinkedQueue::Delete(location& x)
    {
        x=front->data;
        Node* p=front;
        front=front->t;
        delete p;
    }

    识别图元.h----------------------

    #include "queue.h"
    using namespace std;
    #define M 8
    #define N 9
    int tuyuan[M][N]=
    {
        0,0,0,0,0,0,0,0,0,
        0,0,0,1,0,0,0,0,0,
        0,0,0,1,1,0,0,0,0,
        0,0,0,0,0,1,0,0,0,
        0,0,1,0,1,1,0,1,0,
        0,1,1,1,0,1,0,1,0,
        0,1,1,1,0,0,1,1,0,
        0,0,0,0,0,0,0,0,0
    };
    location move1[4]={{1,0},{-1,0},{0,1},{0,-1}};
    void main()
    {
        int i,j;
        int id=2;
        LinkedQueue queue;
        location x;
        location t;
        for (i=0;i<M;i++)
        {
            for (j=0;j<N;j++)
            {
                if (tuyuan[i][j]==1)
                {
                    tuyuan[i][j]=id;
                    x.x=i;
                    x.y=j;
                    queue.Add(x);
                    while(queue.IsEmpty()==false)
                    {
                        queue.Delete(t);
                        for (int k=0;k<4;k++)
                        {
                            x.x=t.x+move1[k].x;
                            x.y=t.y+move1[k].y;
                            if (tuyuan[x.x][x.y]==1)
                            {
                                tuyuan[x.x][x.y]=id;
                                queue.Add(x);
    
                            }
                        }
                    }
                    id++;
                }
                
                
            }
        }
        for (i=0;i<M;i++)
        {
            for (j=0;j<N;j++)
            {
                cout<<tuyuan[i][j]<<"  ";
            }
            cout<<"\n";
        }
        system("pause");
    }
  • 相关阅读:
    Liferay7 BPM门户开发之1:Liferay7开发环境准备
    Liferay-Activiti 企业特性功能介绍 (新版Liferay7)
    Liferay-Activiti 功能介绍 (新版Liferay7基本特性)
    Java入门开发POI读取导入Excel文件
    JAVA动态代理和方法拦截(使用CGLib实现AOP、方法拦截、委托)
    JFrame、JPanel 、Layout开发的简单例子
    Smart/400开发上手5: Cobol开发标准
    Smart/400开发上手4: 调试Cobol代码 (DEBUG with QBATCH)
    Netbeans Platform 工程,免安装JDK
    网络延迟测试结果
  • 原文地址:https://www.cnblogs.com/xds1224/p/3413449.html
Copyright © 2020-2023  润新知