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

这篇具有很好参考价值的文章主要介绍了基于区域生长的图像分割算法!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

区域生长基本原理

区域生长(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和视频讲解!文章来源地址https://www.toymoban.com/news/detail-445460.html

到了这里,关于基于区域生长的图像分割算法!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PCL 区域生长分割(C++详细过程版)

      区域生长分割是PCL里经典的点云聚类分割算法,具体算法原理和实现代码见:PCL 区域生长分割。为充分了解算法实现的每一个细节和有待改进的地方,使用C++代码对算法实现过程进行复现。 注意: 该算法的实现过程中,加入多线程可能会得到错误的结果。因此,未进行

    2024年02月10日
    浏览(35)
  • Open3D 点云分割之区域生长(Python版本,指定种子点)

    点云分割作为许多应用的前提,其直接会关乎到后续利用点云数据进行曲面重建、特征提取等处理的效果。区域生长算法做为一种较为经典的聚类分割算法,具有很广泛的应用,算法过程如下所述: 1、首先将按照每个点的曲率值由小到大进行排序。 2、选择曲率值最小的那个

    2024年02月03日
    浏览(37)
  • 基于区域的图像分割

    基于区域的图像分割是数字图像处理中常用的一种方法,它通过将图像中的像素分配到不同的区域或对象来实现图像分割的目的。相比于基于边缘或阈值的方法,基于区域的图像分割更注重像素之间的相似性和连续性,能够更好地捕捉到图像中不同对象的区域特征。本文将介

    2024年02月05日
    浏览(43)
  • OpenCv案例(九): 基于OpenCvSharp图像分割提取目标区域和定位

    以下原图中,物体连靠在一起,目的是将其分割开,再提取轮廓和定位 原图:   最终效果: 麻烦的地方是,分割开右下角部分,两个连在一起的目标物体,下图所示:  基本方法:BoxFilter滤波、二值化、轮廓提取,凸包检测,图像的矩 代码如下: 灰度图像后图像二值化:

    2024年02月11日
    浏览(37)
  • CloudCompare 二次开发(6)——插件中拖拽添加Qt窗口(区域生长算法为例)

    本文由CSDN点云侠原创,原文链接。爬虫网站自重。   手动拖拽的方式搭建Qt对话框界面的制作流程,以PCL中的点云区域生长算法为例进行制作。 1、将 ....pluginsexample 路径下的 ExamplePlugin 复制一份并修改名字为 CCPointCloudProcess 。 2、创建窗口UI文件 使用任意Qt工程新建对话

    2023年04月11日
    浏览(52)
  • 图像处理技术:数字图像分割 ------ 图像分割、边界分割(边缘检测)、区域分割

    是指根据灰度、彩色、空间纹理、几何形状等特征把图像划分 成若干个互不相交的区域,使得这些特征在同一区域内表现出一致 性或相似性,而在不同区域间表现出明显的不同 分割出来的区域应该同时满足:  (1)分割出来的图像区域的均匀性和连通性。 • 均匀性是指该

    2024年02月04日
    浏览(44)
  • 数字图像处理:图像分割——边缘检测与区域分割

    1.图像分割:根据图像的某些局部特征(灰度级、纹理、彩色或统计特征等)的相似性和互斥性,将图像分割成若干子区域,在每个子区域内部具有相似(相同或相近)特性,而相邻子区域的特性互斥。所以图像分割是利用图像局部特征的相似性和互斥性。 2.图像分割方法分

    2024年02月05日
    浏览(40)
  • 基于Python实现图像分割算法

    资源下载地址:https://download.csdn.net/download/sheziqiong/86763995 资源下载地址:https://download.csdn.net/download/sheziqiong/86763995 结合“Lecture 7 Segmentation”内容及参考文献[1],实现基于 Graph-based image segmentation 方法(可以参考开源代码,建议自己实现) ,通过设定恰当的阈值将每张图分割

    2024年02月05日
    浏览(48)
  • 【图像分割】传统分割算法—分水岭算法(包含基于opencv的实例展示)

    分水岭算法将图像看作地理学中的地形表面,图像中的高灰度值区域被看作山峰,低灰度值区域被看作山谷。进而实现图像的分割。 假如我们向“山谷”中注水,水位则会逐渐升高,然后不同山谷的水就会汇集在一起,如果我们阻止来自不同山谷的水汇集,我们需在水流可能

    2024年02月06日
    浏览(56)
  • 毕业设计-基于 MATLAB 的图像分割算法研究及实现

    目录 前言 课题背景和意义 实现技术思路 一、MATLAB 开发环境简介 二、图像分割算法设计  MATLAB代码  实现效果图样例 最后     📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要

    2024年02月02日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包