魔棒工具--RegionGrow算法简介

摘要:
魔棒工具的核心算法是RegionGrow区域成长法,它的概念很简单,首先在要处理的图片上选取一个种子点,然后以此点为起点,向四周辐射形成一个区域。当成长区域不能再继续扩大时,算法停止。start和end用来记录队列的头和尾,当start==end时,说明所有所有像素已经处理完,函数结束。seedx,seedy:种子点坐标threshold:容差flag:0/1表示搜索方式是8/4邻域structNode{intx;inty;Node*next;};voidMyTreasureBox::RegionGrow{if(!=1)return;intwidth=src-˃width;intheight=src-˃height;intsrcwidthstep=src-˃widthStep;uchar*img=src-˃imageData;//成长区域cvZero;//标记每个像素点是否被计算过IplImage*M=cvCreateImage;intMwidthstep=M-˃widthStep;cvZero;M-˃imageData[seedy*Mwidthstep+seedx]=1;//种子点位置为1,其它位置为0CvScalarcur=CV_RGB;cvSet2D;//队列的两端intstart=0;intend=1;Node*queue=newNode;queue-˃x=seedx;queue-˃y=seedy;queue-˃next=NULL;Node*first=queue;Node*last=queue;while{intx=first-˃x;inty=first-˃y;ucharpixel=img[y*srcwidthstep+x];for{for{ififcontinue;intcx=x+xx;intcy=y+yy;if{if(abs(img[cy*srcwidthstep+cx]-pixel)imageData[cy*Mwidthstep+cx]!

原地址:http://www.cnblogs.com/easymind223/archive/2012/07/04/2576964.html

ps里面的魔棒工具非常好用,是图像处理中非常常用的一个工具,它现在已经是我的c++工具箱中很重要的一员了,我会在以后的时间里把我的工具箱逐渐介绍给大家。

魔棒工具的核心算法是RegionGrow区域成长法,它的概念很简单,首先在要处理的图片上选取一个种子点,然后以此点为起点,向四周辐射形成一个区域。最初成长区域只有种子点这一个点,然后不断把周围的点归并入该成长区域,条件是该点的值与成长区域边界点的值之差小于阈值。当成长区域不能再继续扩大时,算法停止。

魔棒工具--RegionGrow算法简介第1张

算法说明:
区域成长法的思想很好理解,代码实现对于初学者有一定难度。对于满足条件的像素点,函数会把它们一个个的压入队列的尾部,然后从队列的头部一个个的取出来,形成成长区域。M是一个点名册,用来记录每一个像素是否被处理过。start和end用来记录队列的头和尾,当start==end时,说明所有所有像素已经处理完,函数结束。
参数说明:
src: 输入的单通道图像。
dst: 输出的单通道图像,与输入同大小,必须提前开空间。
seedx, seedy:种子点坐标
threshold:容差
flag: 0/1 表示搜索方式是 8/4 邻域
struct Node 
{
    int x;
    int y;
    Node* next;
};

void MyTreasureBox::RegionGrow(const IplImage* src, IplImage* dst, int seedx, int seedy, int threshold, bool flag)
{
    if(!src || src->nChannels != 1)return ;

    int width = src->width;
    int height = src->height;
    int srcwidthstep = src->widthStep;
    uchar* img = (uchar*)src->imageData;

    //成长区域
    cvZero(dst);

    //标记每个像素点是否被计算过
    IplImage* M = cvCreateImage(cvSize(width, height), 8, 1);
    int Mwidthstep = M->widthStep;

    cvZero(M);
    M->imageData[seedy * Mwidthstep + seedx] = 1;    //种子点位置为1,其它位置为0

    CvScalar cur = CV_RGB(255,255,255);
    cvSet2D(dst, seedy, seedx, cur);

    //队列的两端
    int start = 0;
    int end = 1;

    Node *queue = new Node;
    queue->x = seedx;
    queue->y = seedy;
    queue->next = NULL;
    Node *first = queue;
    Node *last = queue;

    while (end - start > 0)
    {
        int x = first->x;
        int y = first->y;
        uchar pixel = (uchar)img[y * srcwidthstep + x];

        for (int yy = -1; yy<=1; yy++)
        {
            for (int xx = -1; xx<=1; xx++)
            {
                if(flag)
                    if ( abs(yy) && abs(xx))
                        continue;

                int cx = x + xx;
                int cy = y + yy;
                if (cx >= 0 && cx <width && cy >=0 && cy < height)
                {
                    if (abs(img[cy * srcwidthstep + cx] - pixel) <= threshold && M->imageData[cy * Mwidthstep + cx] != 1)
                    {
                        Node *node = new Node;
                        node->x = cx;
                        node->y = cy;
                        node->next = NULL;

                        end++;
                        last->next = node;
                        last = node;

                        M->imageData[cy * Mwidthstep + cx] = 1;

                        cvSet2D(dst, cy, cx, cur);
                    }
                }
            }
        }
        Node* temp = first;
        first = first->next;
        delete temp;
        start++;
    }

    cvReleaseImage(&M);
}

免责声明:文章转载自《魔棒工具--RegionGrow算法简介》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Tomcat配置多实例:centos和winserver环境HostOnly Cookie和HttpOnly Cookie下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

c语言中的原子操作

参考文章:https://blog.csdn.net/yikai2009/article/details/8650221 1. 原子操作:原子操作指的是在执行过程中不会被别的代码所中断的操作.。分为 位 和 整型变量 两类原子操作。 typedef struct { volatile int counter; } atomic_t; 2. 原子操作函数 分...

分布式算法(一致性Hash算法)

转载:https://www.cnblogs.com/moonandstar08/p/5405991.html 一、分布式算法     在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括: 轮循算法(Round Robin)、哈希算法(HASH)、最少连接算法(Least Connection)、响应速度算法(Response Time)、加权法(...

单阶多层检测器: SSD(一)

  对于物体检测任务, 第4章的Faster RCNN算法采用了两阶的检测架构, 即首先利用RPN网络进行感兴趣区域生成, 然后再对该区域进行类别的分类与位置的回归, 这种方法虽然显著提升了精度, 但也限制了检测速度。 YOLO算法利用回归的思想, 使用一阶网络直接完成了物体检测, 速度很快, 但是精度有了明显的下降。   在此背景下, SSD(Singl...

一致性hash算法

一致性哈希算法的应用 一致性哈希算法在分布式缓存领域的 MemCached,负载均衡领域的 Nginx 以及各类 RPC 框架中都有广泛的应用 一致性哈希算法解决的问题 普通的哈希表算法一般都是计算出哈希值后,通过取余操作将 key 值映射到不同的服务器上但是当服务器数量发生变化时,取余操作的除数就会发生变化,所有 key 所映射的服务器几乎都会改变,这对...

AI专家警告:GPT-3令人赞叹,但缺乏透明度

  AI专家警告:GPT-3令人赞叹,但缺乏透明度   让算法像人一样写作,是人工智能研究实验室OpenAI多年来一直追寻的梦想。其最新研究成果是语言生成算法模型GPT-3,现已被用于生成让人难以分辨的伪文章,其所写博客骗过了黑客新闻(Hacker News)的发布者,甚至成为网站热门文章。   那个帖子是这样的:“要想把事情做好,也许我们根本不需要想太多...

《Qt数据类型》--QByteArray,QString,int,hex之间的转化

对于QString和QByteArray,他们都有一个toInt的静态函数,QString::toInt()是根据string的字面值转化为int类型,比如string:"123",转化为int类型就变为int:123。而对于QByteArray::toInt()是将16进制的数据转化为10进制之后得到int类型,比如byte:0xf8-->dec:...