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

区域生长基本原理

区域生长(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/

往期精彩回顾适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载中国大学慕课《机器学习》(黄海广主讲)机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑
AI基础下载机器学习交流qq群955171419,加入微信群请扫码:

【深度学习】基于区域生长的图像分割算法!相关推荐

  1. 基于区域生长的图像分割算法!

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

  2. 计算机视觉与深度学习 | 基于MATLAB的Vibe算法消除鬼影(代码版)

    /********************************************************** github:https://github.com/MichaelBeechan ...

  3. 深度学习图像处理目标检测图像分割计算机视觉 04--神经网络与误差反向传播BP算法

    深度学习图像处理目标检测图像分割计算机视觉 04--神经网络与误差反向传播BP算法 摘要 一.神经元 二.前馈网络 2.1 Delta学习规则 2.2 目标函数J(w) 三.误差反向传播算法(BP算法 ...

  4. 基于深度学习的图像识别与图像分割技术

    文章目录 基于深度学习的图像识别与图像分割技术 1. 引言 1.1. 背景介绍 1.2. 文章目的 1.3. 目标受众 2. 技术原理及概念 2.1. 基本概念解释 2.2. 技术原理介绍:算法原理, ...

  5. 中科院张士峰:基于深度学习的通用物体检测算法对比探索

    https://www.toutiao.com/a6674792954369933838/ 人工智能论坛如今浩如烟海,有硬货.有干货的讲座却百里挑一.由中国科学院大学主办,中国科学院大学学生会承办,读 ...

  6. 基于深度学习的磁环表面缺陷检测算法

    基于深度学习的磁环表面缺陷检测算法 人工智能技术与咨询 来源:< 人工智能与机器人研究> ,作者罗菁等 关键词: 缺陷检测:深度学习:磁环:YOLOv3: 摘要: 在磁环的生产制造过程中, ...

  7. 文献阅读笔记:基于深度学习的桥梁裂缝检测算法研究

    论文 | 基于深度学习的桥梁裂缝检测算法研究 作者 | 李良福.马卫飞.李 丽.陆 铖 期刊 | 自动化学报 时间 | 2019年9月 论文目的: 传统的图像处理算法不能很好地对桥梁裂缝进行检测 , ...

  8. 计算机视觉算法——基于深度学习的高精地图算法(HDMapNet / VectorMapNet / MapTR / VectorNet)

    计算机视觉算法--基于深度学习的高精地图算法(HDMapNet / VectorMapNet / MapTR / VectorNet) 计算机视觉算法--基于深度学习的高精地图算法(HDMapNet ...

  9. 深度学习图像处理目标检测图像分割计算机视觉 02--图像特征与描述

    深度学习图像处理目标检测图像分割计算机视觉 02--图像特征与描述 摘要 一.图像特征与描述 1.1.颜色特征 1.2.几何特征提取 1.3.基于特征点的特征描述子 1.3.1.几何特征:关键点 1. ...

最新文章

  1. 机器学习概念 — 监督学习、无监督学习、半监督学习、强化学习、欠拟合、过拟合、后向传播、损失和优化函数、计算图、正向传播、反向传播
  2. java+long.builder_Java LongStream.Builder accept()用法及代码示例
  3. SAP中国际贸易条款的含义
  4. 这6部超经典的物理电影,居然还有人没有看过?
  5. 计算机网络课程实训方法,《计算机网络基本原理》实践环节指导一
  6. MaskFusion:惊艳的结合实例感知、语义分割、动态追踪的SLAM系统
  7. JavaScript异常处理
  8. java经纬度凸包graham_计算几何-凸包-Graham算法
  9. 2010-2014总结 ____V_V____ hello-world
  10. Deploy Oracle 10.2.0.5 on Red Hat Enterprise Linux 6.4
  11. 我的gentoo安装纪念贴移植空间版
  12. @Scope作用域代理的应用:@RefreshScope注解实现动态刷新配置的底层原理与实现
  13. 下载sqlserver2012 试用_大肥虫助手下载-大肥虫助手 安卓版v7.0.4
  14. 【BIM入门实战】Navisworks2018简体中文安装教程(附安装包下载)
  15. 【小程序开发】开发一个短信登录验证(后端采用springboot)
  16. P17安全领袖圆桌:安全市场迎来千亿发展机遇,腾讯携手产业链伙伴共建安全生态
  17. [转]firefox浏览器油猴脚本-让网页背景成苹果蓝,保护眼睛
  18. 关于在ARM中的函数调用问题
  19. Python scrapy 实现网页爬虫
  20. 搞个网站需要多少钱【网站费用】

热门文章

  1. c语言中有bool型变量吗?
  2. Android ImageView图片代码实现按屏幕宽度等比例缩放
  3. iOS推送小结--swift语言
  4. 码农干货系列【17】--Wind.js与Promise.js
  5. idea java 注释模板配置
  6. FJOI2018二试游记
  7. 背水一战 Windows 10 (30) - 控件(文本类): AutoSuggestBox
  8. 洛谷 P1821 [USACO07FEB]银牛派对Silver Cow Party
  9. 解决 connect to host github.com port 22 operation timed out
  10. Android简易实战教程--第四十七话《使用OKhttp回调方式获取网络信息》