参考:http://www.cnblogs.com/easymind223/archive/2012/07/04/2576964.html
ps里面的魔棒工具非常好用,是图像处理中非常常用的一个工具,它现在已经是我的c++工具箱中很重要的一员了,我会在以后的时间里把我的工具箱逐渐介绍给大家。
魔棒工具的核心算法是RegionGrow区域成长法,它的概念很简单,首先在要处理的图片上选取一个种子点,然后以此点为起点,向四周辐射形成一个区域。最初成长区域只有种子点这一个点,然后不断把周围的点归并入该成长区域,条件是该点的值与成长区域边界点的值之差小于阈值。当成长区域不能再继续扩大时,算法停止。
算法说明:
区域成长法的思想很好理解,代码实现对于初学者有一定难度。对于满足条件的像素点,函数会把它们一个个的压入队列的尾部,然后从队列的头部一个个的取出来,形成成长区域。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);
}
欢迎关注微信公众号——计算机视觉:
相关推荐
一个类似PS的魔棒工具的实现,可以看我的2篇博文,使用漫水填充算法与边缘检测,获取边界与区域掩码图。
魔棒工具的算法使用的是Flood Fill,用了Web Workers来做计算,尽可能保证界面的响应蚁线参考Code Pen的这个示例。当图像缩放到尺寸较大时有渲染性能问题钢笔工具为了方便判断,直线去曲线都是用bezierCurveTo方法来...
快速选择工具和魔棒工具讲解PPT
为讲解Photoshop里的快速选择工具和魔棒工具提供教案
【目标受众】: 本项目适合IT相关专业各种计算机技术的源代码和项目资料,如计科、人工智能、通信工程、自动化和电子信息等的在校学生、老师或者企业员工下载使用。 也适合小白学习进阶,可以用作比赛项目、可以进行...
PS基础教程-魔棒工具的使用.doc
PhotoshopCS视频文件
C#魔棒工具的羽化功能的源码,详细请看我的博客。使用卷积进行模糊处理ALPHA通道达到羽化效果。
自己写的一个种子填充算法,又叫洪水填充,设置了阈值,简单的实现了Photoshop中的魔棒算法,与大家分享一下!
微格教学教案(photoshop魔棒工具).doc
Photoshop图像的选取套索和魔棒工具全解.pptx
模拟 Photoshop 的魔棒工具的功能。 它允许选择连接的像素组,其颜色在一些参考像素的预定义容差内。 图像和参考像素都可以交互地获得。 当前版本基于 Phung 的魔法棒,但速度更快且交互性更强。
基于SLIC图像分割算法实现一个比PS魔棒工具还方便的抠图工具 参考项目:
Photoshop图像的选取(套索和魔棒工具)全解.ppt
主要内容见标题,代码中也注释了漫水填充的作用。与本代码配套的pdf传送门: http://download.csdn.net/download/xyz59886/9961184 (在我的专辑中也可以找到)pdf扫描的时候有几页没扫到,所以出现了好几页重复,...
资源介绍:普遍影响魔术棒选取速度的是选取区域的复杂程度,在E语言中主要是几点: 1)位图支持库取颜色矩阵的方式(我们这里主要是取点); 2)位图支持库内部具体的处理过程(这点主要通过图形旋转... 4)算法.资源作者:
PS抠图教程
基于Qt+C++实现仿Photoshop魔棒实现(树木边缘检测)+源码,适合期末大作业、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于Qt+C++实现仿Photoshop魔棒实现(树木边缘检测)...
这是利用halcon做的一个模拟Photoshop里的一个魔棒抠图程序
本资源主要介绍 AI 软件左侧工具栏中的各种绘图工具的使用方法,涵盖了魔棒工具、套索工具、钢笔工具、曲率工具、文字工具、直线段工具、矩形工具、画笔工具、Shaper 工具、橡皮擦工具等多种工具的使用效果和技巧。...