图像分割的目的是将图像划分为多个不同的区域,所以我们可以直接从寻找图像中的区域来设计分割算法。区域生长正是一种基于区域寻找的传统图像分割算法。

区域生长基本原理

区域生长(Region Growth)算法是一种基于区域的传统图像分割算法。区域生长可以根据预先定义的生长规则将像素或者小区域不断组合为更大区域的过程。具体地,区域生长是从一组初始种子点出发,通过预先定义的区域生长规则,将与种子点性质相似的领域像素不断添加到每个种子点上,并且满足区域生长的终止条件时形成最终生长区域的过程。假设为待分割的输入图像阵列,为一组种子点阵列,其中种子点处位置为1,其他位置为0,并且假设和具有相同的尺寸。表示在每个像素点的相关属性。基于8连接的区域生长算法的流程描述如下:

  • 在种子阵列中找到所有的连通分量,将每个连通分量腐蚀为一个像素,并将腐蚀成功的像素标记为1,其他像素标记为0.

  • 在坐标形成图像,如果输入图像在该点坐标处满足给定的属性,则令,否则令。

  • 将中为8连通种子点的所有为1的点添加到s中的每个种子点中直至满足生长结束条件。

  • 最后在不同区域标记出每个连通分量形成最终的分割图像。

下面我们通过一个简单的计算例子来更加直观地理解区域生长算法。

假设有如图所示的5×5图像阵列,选定阵列中最大值9作为初始种子点(图中橙色像素块),区域生长的像素阈值为2,现按照区域生长算法对该图像阵列进行分割。

按照区域生长阈值2,取值范围为[7,11],生长后的区域像素均值为7.8。第一次生长效果如图2所示,蓝色区域即第一次生长后的区域。

第一次生长后的区域均值为7.8,按照生长阈值为2,第二次生长的像素取值范围应为[5.8,9.8],如图3所示,绿色部分为第二次生长的区域结果。

第二次生长后的区域均值为7.1,按照生长阈值为2,第三次生长的像素取值范围应为[5.1,9.1],如图4所示,黄色部分为第三次生长的区域结果。

第三次生长后的区域均值为6.9,按照生长阈值为2,第三次生长的像素取值范围应为[4.9,8.9],周边已没有满足继续生长的像素点,到此我们停止生长。将生长后的区域标记为1,其他区域标记为0,最终的分割区域如图5所示。

区域生长分割示例

给定一张NBA球星科比的图像(如图6所示),我们尝试实现一个区域生长图像分割算法来对该图像进行前景与背景的分割。

现尝试基于C++代码来实现一个区域生长分割算法。按照前述基于8连接的区域生长算法的流程描述,实现过程如下代码所示。

#include <iostream>
#include <opencv2/opencv.hpp>using namespace std;
using namespace cv;
// 定义区域生长分割算法
bool RegionGrowing(Mat img, Mat& result, Point2i seed, int threshold) {// 将图像全部设置为黑result = Mat::zeros(img.size(), CV_8UC1); // 设置种子点范围条件if (seed.x < 0 || seed.y < 0 || seed.y > img.rows - 1 || seed.x > img.cols - 1) {return false;}// 种子点集vector<Point2i> seeds; // 压入初始种子点seeds.push_back(seed); // 种子点设置为白result.ptr<uchar>(seed.y)[seed.x] = 255; // 8连接生长方向int growDirections[8][2] = { {-1,-1}, {0,-1}, {1,-1}, {-1,0}, {1,0}, {-1,1}, {0,1}, {1,1} }; // 开始生长while (!seeds.empty()) {// 取出一个种子点作为现在循环的初始种子点Point2i seed_current = seeds.back();seeds.pop_back();// 遍历各生长方向的邻点for (int i = 0; i < 8; i++) {Point2i neighborPoint = { seed_current.x + growDirections[i][0], seed_current.y + growDirections[i][1] }; // 邻点if (neighborPoint.x < 0 || neighborPoint.y < 0 || neighborPoint.x > img.cols - 1 || neighborPoint.y > img.rows - 1) { // 邻点超出范围continue;}if ((result.ptr<uchar>(neighborPoint.y)[neighborPoint.x] == 0) && abs(img.ptr<uchar>(neighborPoint.y)[neighborPoint.x] - img.ptr<uchar>(seed.y)[seed.x]) < threshold) {// 设置为种子点result.ptr<uchar>(neighborPoint.y)[neighborPoint.x] = 255; // 设置为白色seeds.push_back(neighborPoint); // 压入种子集}}}return true;
}

基于上述代码分割后的图像如图7所示。可以看到,区域生长算法基本上能分割出目标区域,但因为图像本身复杂性,在分割效果上仍有待提升的地方。

参考资料:

冈萨雷斯 数字图像处理

https://gy23333.github.io/2020/01/18/%E5%9F%BA%E4%BA%8E%E5%8C%BA%E5%9F%9F%E7%9A%84%E5%9B%BE%E5%83%8F%E5%88%86%E5%89%B2%E2%80%94%E2%80%94%E5%8C%BA%E5%9F%9F%E7%94%9F%E9%95%BF/

往期精彩:

《机器学习:公式推导与代码实现》1-7章PPT下载

《机器学习 公式推导与代码实现》随书PPT示例

时隔一年!深度学习语义分割理论与代码实践指南.pdf第二版来了!

新书首发 | 《机器学习 公式推导与代码实现》正式出版!

《机器学习公式推导与代码实现》将会配套PPT和视频讲解!

基于区域生长的图像分割算法!相关推荐

  1. 【深度学习】基于区域生长的图像分割算法!

    图像分割的目的是将图像划分为多个不同的区域,所以我们可以直接从寻找图像中的区域来设计分割算法.区域生长正是一种基于区域寻找的传统图像分割算法. 区域生长基本原理 区域生长(Region Growth) ...

  2. 图像分形的matlab算法,基于MATLAB的图像分割算法研究

    内容介绍 原文档由会员 花季永驻 发布 基于MATLAB的图像分割算法研究 全文54页 约28000字 论述翔实 摘 要 本文从原理和应用效果上对经典的图像分割方法如边缘检测.阈值分割技术和区域增长等 ...

  3. 基于matlab的图像分割,基于MATLAB的图像分割算法研究毕业论文

    作者姓名   XXX 学号 指导教师    XX教授 学科专业   计算机科学与技术 所在学院     计算机学院 提交日期 结  论 数字图像目标分割与提取是数字图像处理和计算机视觉领域中一个备受关 ...

  4. 毕业设计-基于 MATLAB 的图像分割算法研究及实现

    目录 前言 课题背景和意义 实现技术思路 一.MATLAB 开发环境简介 二.图像分割算法设计 MATLAB代码 实现效果图样例 最后 前言

  5. 基于graph的图像分割算法:Efficient Graph-Based Image Segmentation

    Reference: [1] Felzenszwalb, P.F. & Huttenlocher, D.P. International Journal of Computer Vision ...

  6. matlab 图像分割_好文章:基于MATLAB的图像分割算法研究

    摘 要 本文从原理和应用效果上对经典的图像分割方法如边缘检测.阈值分割技术和区域增长等进行了分析.对梯度算法中的Roberts算子.Sobel算子.Prewitt算子.拉普拉斯(Laplacian)算 ...

  7. 基于Python实现图像分割算法

    资源下载地址:https://download.csdn.net/download/sheziqiong/86763995 资源下载地址:https://download.csdn.net/downl ...

  8. matlab使用kirsch算子进行分割,matlab的图像分割算法

    学术探讨 经验交流 浅析基于 MATLAB 的图像分割方法蒋翠翠 (华中师范大学... 图像分割技术与 MATLAB 仿真 精品文档中南民族大学毕业论文(设计) 学院: 专业: 计算机科学学院 自动化 ...

  9. 最全综述 | 图像分割算法

    原文链接传送 图像分割是计算机视觉研究中的一个经典难题,已经成为图像理解领域关注的一个热点,图像分割是图像分析的第一步,是计算机视觉的基础,是图像理解的重要组成部分,同时也是图像处理中最困难的问题之一 ...

最新文章

  1. html5新增属性有哪些,HTML5 新增属性
  2. fzu 2154 YesOrNo
  3. 使用SQL语句获取SQL Server数据库登录用户权限
  4. C++ 控制结构和函数(一) —— 控制结构
  5. python中a and b什么意思_Python中的a+=b和a=a+b之间的区别是什么?
  6. bzoj 4196 树链剖分 模板
  7. 排序算法_总结与复习
  8. 蓝懿iOS培训日志11 递归
  9. oracle数据库执行sql很慢
  10. TCP建立连接的三次握手过程
  11. mysql dump语句_mysql/mariadb知识点总结(28):mysql备份工具之mysqldump
  12. 最新彩虹DS仿小储云模板源码
  13. 防火墙多选路出口(ISP选路、策略路由、智能选路)
  14. 国防科技大学计算机考研资料汇总
  15. 计算机乱七八糟小知识备忘录
  16. python pip 安装包失败问题,下载缓慢问题
  17. 内农大《嵌入式基础》实验一 Shell编程
  18. Prim算法最小生成树Java超详解
  19. 验证中的随机种子(seed),VCS
  20. TO_DATS() AS ABAP_DATE

热门文章

  1. c++ 判断电脑是否装有vc_redist.x86 运行时库
  2. 用VB.NET写的一个简易的RSS阅读器
  3. 动态调试之——x64dbg的使用
  4. vim 使用set paste 解决多行复制粘贴乱序问题
  5. 基础实验 7-2.1 魔法优惠券(25 分)
  6. 外卖返利系统外卖返利公众号外卖返利源码
  7. ansys一段时间后进入model报错:ansysWBU.exe encountered a problem.
  8. 计算机怎么打开隐藏的项目,展示win10系统怎么打开隐藏文件夹
  9. 为什么你的人脉都没什么用!
  10. Python自动化-APPium原理解析与实际测试案例分享