原地址:http://www.cnblogs.com/easymind223/archive/2012/07/04/2576964.html
ps里面的魔棒工具非常好用,是图像处理中非常常用的一个工具,它现在已经是我的c++工具箱中很重要的一员了,我会在以后的时间里把我的工具箱逐渐介绍给大家。
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); }