from: 魔棒工具--RegionGrow算法简介

  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);
}

魔棒工具--RegionGrow算法简介相关推荐

  1. 数据结构与算法:算法简介

    数据结构与算法:算法简介 雪柯 大工生物信息 提笔为写给奋进之人 已关注 你说呢 . shenwei356 等 70 人赞同了该文章 引用自算法图解,作者[美] Aditya Bhargava 译袁国 ...

  2. hash算法_一致性hash算法简介

    一致性hash算法有什么用?我们为什么需要一致性hash算法?这两个问题的答案可以看这篇文章 分布式系统路由算法简介. 了解了一致性hash算法出现的背景,我们来看看什么是一致性hash算法.一致性h ...

  3. Minimax 和 Alpha-beta 剪枝算法简介,及以此实现的井字棋游戏(Tic-tac-toe)

    前段时间用 React 写了个2048 游戏来练练手,准备用来回顾下 React 相关的各种技术,以及试验一下新技术.在写这个2048的过程中,我考虑是否可以在其中加入一个 AI 算法来自动进行游戏, ...

  4. 推荐系统算法_机器学习和推荐系统(二)推荐算法简介

    推荐算法简介 一. 基于人口统计学的推荐算法 二.基于内容的推荐算法 三. 基于协同过滤的推荐算法 协同过滤(Collaborative Filtering , CF) 基于近邻的系统过滤 基于用户( ...

  5. 图像迁移风格保存模型_CV之NS:图像风格迁移(Neural Style 图像风格变换)算法简介、关键步骤配图、案例应用...

    CV之NS:图像风格迁移(Neural Style 图像风格变换)算法简介.过程思路.关键步骤配图.案例应用之详细攻略 目录 图像风格迁移算法简介 图像风格迁移算法过程思路 1.VGG对比NS 图像风 ...

  6. 【数据挖掘】基于划分的聚类方法 ( K-Means 算法简介 | K-Means 算法步骤 | K-Means 图示 )

    文章目录 一. 基于划分的聚类方法 二. K-Means 算法 简介 三. K-Means 算法 步骤 四. K-Means 方法的评分函数 五. K-Means 算法 图示 一. 基于划分的聚类方法 ...

  7. AI - 常见算法简介(Common Algorithms)

    机器学习常见算法简介 - 原文链接:http://usblogs.pwc.com/emerging-technology/machine-learning-methods-infographic/ 应 ...

  8. DL之CNN:卷积神经网络算法简介之原理简介——CNN网络的3D可视化(LeNet-5为例可视化)

    DL之CNN:卷积神经网络算法简介之原理简介--CNN网络的3D可视化(LeNet-5为例可视化) CNN网络的3D可视化 3D可视化地址:http://scs.ryerson.ca/~aharley ...

  9. DL之CNN:计算机视觉之卷积神经网络经典算法简介、重要进展、改进技巧之详细攻略(建议收藏)

    DL之CNN:计算机视觉之卷积神经网络经典算法简介.重要进展.改进技巧之详细攻略(建议收藏) 目录 CNN经典算法细讲 1.CNN历年冠军算法 1.1.LeNet-5 1.2.AlexNet 1.3. ...

最新文章

  1. mysql和sqlserver共存_mysql 和sqlserver的 多行合并成一行
  2. AAA及Radius
  3. 查询mysql存储数据大小_MySQL如何查询数据占用存储空间的大小?
  4. Php基础数学运算篇
  5. 获取zabbix监控数据
  6. 马云经典语录:我不是传奇 我是平凡的人
  7. python,web框架说明
  8. 如何获取一个需要登录页面的HTML代码
  9. Atitit 并发技术的选项 attilax总结 艾龙 著 1. 三大并发模型 1 2. 从可读性考虑 优先使用 并行工作者 多线程模式,不要使用异步流水线模式 2 2.1. 多线程模式方便全局
  10. 网易云音乐服务器code521,宝塔面板部署网易云音乐无版权服务器
  11. 2022年全新UI聚合支付系统四方源码4月最新更新安全升级修复XSS漏洞和补单漏洞新增诸多实用功能完美版
  12. java表达upll导包在哪_用java实现http断点续传.mht 源代码在线查看 - 自己平时从网上搜集的http协议解析文档 资源下载 虫虫电子下载站...
  13. electron????开发跨平台桌面应用程序???
  14. 互联网早报 | 8月26日 星期三 | 蚂蚁集团递交招股文件;TikTok首次披露用户数据;滴滴开辟首个欧洲市场...
  15. DIY电脑检测软件大集中
  16. python opencv 图像大小_python使用OpenCV设置图片尺寸
  17. vue整合uniapp_uni-app仿微信App界面|vue+uniapp聊天室|仿微信朋友圈
  18. 15/18位身份证号码正则表达式(详细版)
  19. 我的世界java版怎么用结构方块_我的世界结构方块指令(获取结构方块和 使用方法)...
  20. The certificate issuer‘s certificate has expired. Check your system date and time.“

热门文章

  1. VS2012下安装配置OpenCV2.4.9的方法
  2. 陈硕智能指针线程安全_C++ 创建线程的方法
  3. RedHat7/CentOS7 压缩解压命令汇总
  4. django之模板语法
  5. 四种方式主导你的第一个敏捷项目
  6. 20165303实验一 Java开发环境的熟悉
  7. ubuntu搭配lamp
  8. c# 串口最简单接收十六进制
  9. NGUI ListEventDelegate 小坑
  10. linux下安装jdk+tomcat+eclipse+mysql