参考: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的魔棒工具,需要理解并掌握漫水填充算法、边缘检测技术,以及C#编程和图像处理库的使用。通过这个过程,你不仅可以创建出一个实用的图像处理工具,还能深入学习到图像处理和计算机视觉领域...
PS 基础教程-魔棒工具的使用 魔棒工具是 Photoshop 中提供的一种比较快捷的抠图工具,对于一些分界线比较明显的图像,通过魔棒工具可以很快速的将图像抠出。本文将通过一个例子来讲解一下魔棒工具的使用。 魔棒...
快速选择工具和魔棒工具是Adobe Photoshop中两个非常实用的选取工具,它们在图像编辑和设计工作中起着至关重要的作用。本教案旨在帮助学生掌握这两个工具的使用技巧,提升他们在图像处理上的效率。 首先,我们来...
魔棒工具的算法使用的是Flood Fill,用了Web Workers来做计算,尽可能保证界面的响应蚁线参考Code Pen的这个示例。当图像缩放到尺寸较大时有渲染性能问题钢笔工具为了方便判断,直线去曲线都是用bezierCurveTo方法来...
Photoshop 图像选取(套索和魔棒工具)全解 在 Photoshop 中,图像选取是图像编辑的基础步骤之一。套索工具和魔棒工具是 Photoshop 中两种常用的选取工具,分别用于选取图像的边缘和颜色相似区域。本文将详细介绍...
快速选择工具和魔棒工具讲解PPT
在本文中,我们将深入探讨C#编程语言中的“魔棒工具”实现,特别是关于羽化功能的源码。羽化是图像处理中的一个重要概念,它允许我们创建平滑的边缘过渡,使选区与背景之间更加自然融合。在C#中,我们可以利用卷积...
【目标受众】: 本项目适合IT相关专业各种计算机技术的源代码和项目资料,如计科、人工智能、通信工程、自动化和电子信息等的在校学生、老师或者企业员工下载使用。 也适合小白学习进阶,可以用作比赛项目、可以进行...
- W: 魔棒工具 - J: 喷枪工具 - B: 画笔工具 - E: 像皮擦工具 - N: 铅笔工具 - R: 模糊、锐化、涂抹工具 - O: 减淡、加深、海绵工具 - P: 钢笔工具、自由钢笔工具、磁性钢笔工具 - A: 直接选取工具 - T: ...
魔棒工具在Photoshop中的应用通常包括以下几个步骤: 1. **设置阈值**:用户可以设定一个颜色相似度阈值,这决定了算法会选择哪些颜色的像素。阈值越大,选择的颜色范围越窄,反之则更宽。 2. **选择种子点**:...
- W:魔棒工具 - Ctrl + T:自由变换 5. 调整和绘图: - B:画笔工具 - P:铅笔工具 - E:橡皮擦工具 - I:渐变工具 - G:填充工具 - R:旋转工具 - T:文本工具 - H:手形工具 6. 视图控制: - Alt + ...
PhotoshopCS视频文件
- `W`:魔棒工具 - `J`:喷枪工具 - `B`:画笔工具 - `E`:橡皮擦工具 - `N`:铅笔工具 - `R`:模糊、锐化、涂抹工具 - `O`:减淡、加深、海绵工具 - `P`:钢笔工具系列 - `A`:直接选取工具 - `T`:文字...
通过研究这些文件,你可以了解如何在 MATLAB 中实现魔棒工具的细节,包括具体的算法和数据结构。这不仅对学习 MATLAB 图像处理有帮助,也对理解图像分析和颜色空间概念有所裨益。同时,这样的项目还可以作为进一步...
- W:魔棒工具 三、绘图及修饰工具: - J:喷枪工具 - B:画笔工具 - E:橡皮擦工具 - N:铅笔工具 - R:模糊、锐化、涂抹工具 - O:减淡、加深、海绵工具 - P:钢笔工具 - A:直接选取工具 四、文本相关: - T:...
- `W`:魔棒工具 - `J`:喷枪工具 - `B`:画笔工具 - `E`:橡皮擦工具 - `N`:铅笔工具 - `R`:模糊、锐化、涂抹工具 - `O`:减淡、加深、海绵工具 - `P`:钢笔工具 - `A`:直接选取工具 - `T`:文字工具 - `U`:...
- `E`:魔棒工具 - `A`:路径选择工具 3. **画笔与橡皮擦** - `B`:画笔工具 - `E`:橡皮擦工具 - `X`:切换前景色和背景色 - `D`:恢复默认的前景色和背景色(黑色和白色) 4. **调整工具** - `I`:吸管...
微格教学教案(photoshop魔棒工具).doc
##### 第27节:魔棒工具 - 根据颜色相似度自动选择相邻像素,适合单一色调区域的选择。 ##### 第28节:调整边缘命令抠出树叶图像 - 使用“调整边缘”对话框精细化选区边缘,尤其适用于头发或树叶等细节丰富的对象。...
- `W`:魔棒工具 - `J`:快速选择工具 - `B`:画笔工具 - `S`:橡皮擦工具 - `E`:橡皮擦工具(背景橡皮擦) - `N`:铅笔工具 - `R`:涂抹工具 - `O`:渐变工具 - `T`:文字工具 - `U`:测量工具 - `P`:...