• 区域增长算法


    区域增长的算法实现: 1)根据图像的不同应用选择一个或一组种 子,它或者是最亮或最暗的点,或者是位 于点簇中心的点 2...通过像素集合的区域增长 算法实现: 区域A 区域B 种子像素增长.3)增长的规则 4)
    结束条件.

    BOOL RegionGrow(int nSeedX, int nSeedY, BYTE * pUnchInput,int nWidth, int nHeight, BYTE * pUnRegion,CRect &R)
    {

    int nDx[] = {-1,1,0,0};
    int nDy[] = {0,0,-1,1};
    int nSaveWidth = nWidth;

    // 定义堆栈,存储坐标
    int * pnGrowQueX ;
    int * pnGrowQueY ;

    // 分配空间
    pnGrowQueX = new int [nWidth*nHeight];
    pnGrowQueY = new int [nWidth*nHeight];

    // 定义堆栈的起点和终点
    // 当nStart=nEnd, 表示堆栈中只有一个点
    int nStart ;
    int nEnd ;

    //初始化
    nStart = 0 ;
    nEnd = 0 ;

    // 把种子点的坐标压入栈
    pnGrowQueX[nEnd] = nSeedX;
    pnGrowQueY[nEnd] = nSeedY;

    // 当前正在处理的象素
    int nCurrX ;
    int nCurrY ;

    // 循环控制变量
    int k ;

    // 图象的横纵坐标,用来对当前象素的8邻域进行遍历
    int xx;
    int yy;

    while (nStart<=nEnd)
    {
    // 当前种子点的坐标
    nCurrX = pnGrowQueX[nStart];
    nCurrY = pnGrowQueY[nStart];

    // 对当前点的4邻域进行遍历
    for (k=0; k<4; k++)
    {
    // 4邻域象素的坐标
    xx = nCurrX+nDx[k];
    yy = nCurrY+nDy[k];

    // 判断象素(xx,yy) 是否在图像内部
    // 判断象素(xx,yy) 是否已经处理过
    // pUnRegion[yy*nWidth+xx]==0 表示还没有处理

    // 生长条件:判断象素(xx,yy)和当前象素(nCurrX,nCurrY) 象素值差的绝对值
    if ( (xx < nWidth) && (xx>=0) && (yy>=0) && (yy<nHeight)
    && (pUnRegion[yy*nWidth+xx]==0) && (pUnchInput[yy*nSaveWidth+xx]==1))
    {
    // 堆栈的尾部指针后移一位
    nEnd++;

    // 象素(xx,yy) 压入栈
    pnGrowQueX[nEnd] = xx;
    pnGrowQueY[nEnd] = yy;

    // 把象素(xx,yy)设置成逻辑1(255)
    // 同时也表明该象素处理过
    pUnRegion[yy*nWidth+xx] = 255 ;
    }
    }
    nStart++;
    }


    //找出区域的范围
    int nMinx=pnGrowQueX[0], nMaxx=pnGrowQueX[0], nMiny=pnGrowQueY[0], nMaxy = pnGrowQueY[0];
    for (k=0; k<nEnd; k++)
    {
    if (pnGrowQueX[k] > nMaxx)
    nMaxx = pnGrowQueX[k];
    if (pnGrowQueX[k] < nMinx)
    nMinx = pnGrowQueX[k];
    if (pnGrowQueY[k] > nMaxy)
    nMaxy = pnGrowQueY[k];
    if (pnGrowQueY[k] < nMiny)
    nMiny = pnGrowQueY[k];
    }

    if ((nMaxy - nMiny) > 40 && (nMaxx - nMinx) > 40)
    {
    R.left = nMinx;
    R.right = nMaxx;
    R.top = nMiny;
    R.bottom = nMaxy;
    return TRUE;
    }
    // 释放内存
    delete []pnGrowQueX;
    delete []pnGrowQueY;
    pnGrowQueX = NULL ;
    pnGrowQueY = NULL ;
    return FALSE;
    }

    //调用方法
    void OnButton(LPBYTE S,int ImageWidth,int ImageHeight)
    {
    int i=0,j=0;
    CRect rect;
    LPBYTE lpFlag = new BYTE[ImageWidth*ImageHeight];
    memset(lpFlag,0,ImageWidth*ImageHeight);
    for (i=0; i<ImageHeight; i++)
    {
    for (j=0; j<ImageWidth; j++)
    {
    if (S[i*ImageWidth+j] == 1 && lpFlag[i*ImageWidth+j] == 0)
    {
    RegionGrow(j, i, S, ImageWidth, ImageHeight, lpFlag,rect);
    }
    }

    }

    if(lpFlag!=NULL)
    {
    delete []lpFlag;
    lpFlag = NULL;
    }
    }
  • 相关阅读:
    剑指offer 合并两个排序的链表
    剑指offer 把字符串转换成整数
    剑指offer 数组中重复的数字
    剑指offer 数字在排序数组中出现的次数
    剑指offer 替换空格
    go学习笔记-错误处理
    go学习笔记-类型转换(Type Conversion)
    go学习笔记-语言指针
    go学习笔记-包处理
    go学习笔记-面向对象(Methods, Interfaces)
  • 原文地址:https://www.cnblogs.com/toosuo/p/1010284.html
Copyright © 2020-2023  润新知