在photoshop中我们常用的一个功能就是选择区域,用魔法棒选择工具点击图片上的一个点就会选中跟该点颜色一样的连续或非连续区域。这是怎么做到的呢?下面是我用php实生的区域生长算法。

<?php/*** 找到生长区域** @param array $arr  数据数组* @param array $seed 种子点* @return array*/
function getGrowRegion($arr, $seed, $mode=4)
{$seed_value = $seed['value'];$queue = array();$label = array();if ($arr[$seed['y']][$seed['x']] == $seed_value){$queue[] = $seed;$label[$seed['y']][$seed['x']] = 1;// 标记}// 判断该点4或8个方向上的值,如果未被标记就标记,并加入到队列中switch ($mode){case 4:default:$directions = array(array(-1, 0),array(1, 0),array(0, -1),array(0, 1));break;case 8:$directions = array(array(-1, 0),array(1, 0),array(0, -1),array(0, 1),array(-1, -1),array(-1, 1),array(1, -1),array(1, 1),);break;}while(!empty($queue)){$current = array_shift($queue);foreach ($directions as $key => $val){$y_idx = $current['y'] + $val[0];$x_idx = $current['x'] + $val[1];if (isset($arr[$y_idx][$x_idx]) && $arr[$y_idx][$x_idx] == $seed_value && !isset($label[$y_idx][$x_idx])){$label[$y_idx][$x_idx] = 1;$queue[] = array('y' => $y_idx, 'x' => $x_idx);}}}return $label;
}// 生长区域测试
$str = <<<EOT
000000000000000000000000000000
000000000000000000000000000000
000000000000000000000000000000
000000000000000000000000000000
000000000000000000000000000000
000000000000000000000000000000
000000000000000000000000000000
000000000000011100000000000000
000000000000011100000000000000
000000000000011110000000000000
000000000000111110000000000000
000000000000110111000000000000
000000000000110111000000000000
000000000001110011000000000000
000000000001111111100000000000
000000000011111111100000000000
000000000011111111110000000000
000000000011000001110000000000
000000000111000000110000000000
000000000111000000111000000000
000000000000000000000000000000
000000000000000000000000000000
000000000000000000000000000000
000000000000000000000000000000
000000000000000000000000000000
000000000000000000000000000000
000000000000000000000000000000
000000000000000000000000000000
EOT;$data = preg_split('/[\r\n]+/', $str);// 切分成行数组// 处理成二维坐标数组
$arr = array();
foreach ($data as $y => $val)
{$x_len = strlen($val);for ($x = 0; $x < $x_len; $x++){$arr[$y][$x] = $val{$x};}
}// 设置种子点,这里取左上角,value是要匹配的值
// 这里的意思就是以左上角为起点,所有值为0的点全部作为要匹配的区域
$seed = array('y' => 0, 'x' => 0, 'value' => '0');
$result = getGrowRegion($arr, $seed);// 输出反转之后的字符串
foreach ($arr as $y => $rows)
{foreach ($rows as $x => $val){if (isset($result[$y][$x])){echo $result[$y][$x];}else{echo $val==1? 0 : 2;// 非生长点}}echo "\n";
}

运行后的输出结果如下:

111111111111111111111111111111
111111111111111111111111111111
111111111111111111111111111111
111111111111111111111111111111
111111111111111111111111111111
111111111111111111111111111111
111111111111111111111111111111
111111111111100011111111111111
111111111111100011111111111111
111111111111100001111111111111
111111111111000001111111111111
111111111111002000111111111111
111111111111002000111111111111
111111111110002200111111111111
111111111110000000011111111111
111111111100000000011111111111
111111111100000000001111111111
111111111100111110001111111111
111111111000111111001111111111
111111111000111111000111111111
111111111111111111111111111111
111111111111111111111111111111
111111111111111111111111111111
111111111111111111111111111111
111111111111111111111111111111
111111111111111111111111111111
111111111111111111111111111111
111111111111111111111111111111

可以看到原来为0的点全换成了1,但图形中间的点不受影响,我将其标记成了2。

转载于:https://blog.51cto.com/ustb80/1569590

生长区域算法的php实现相关推荐

  1. 种子生长相关算法实现

    下文提到的种子点生长算法,包括泛洪法,扫描线法,区段法三种.文本先从最简单的泛洪法入手介绍种子点生长算法的相关概念.之后进一步讨论了扫描线法和区段法,同时提供了实验数据验证其中的一些结论.本文按照如下 ...

  2. 学习笔记3分支--学习笔记2-候选区域算法

    候选区域算法 object recognition=目标识别=物体识别目标识别是要分辨出图片中有什么物体,输入是图片,输出是类别标签和概率. object dection=目标检测=物体检测:目标检测 ...

  3. 计算机视觉基础知识复习

    计算机视觉 CV01-introduction 取样和量化#### 图像表达 像素基本关系 m邻接定义: CV03-image preprocessing 代数运算 加法: 减法: 逻辑运算 几何运算 ...

  4. 种子点生长算法(上)——二维种子点生长

    本文只用作笔记,方便日后查阅. 种子点生长算法上--二维种子点生长 下文提到的种子点生长算法,包括泛洪法,扫描线法,区段法三种.文本先从最简单的泛洪法入手介绍种子点生长算法的相关概念.之后进一步讨论了 ...

  5. R-CNN算法学习(步骤一:候选区域生成)

    R-CNN算法学习(步骤一:候选区域生成) 论文链接:https://arxiv.org/abs/1311.2524 源码链接:https://github.com/rbgirshick/rcnn 算 ...

  6. 数字图像处理中常用图像分割算法有哪些?

    数字图像处理中常用图像分割算法有哪些? 1.多数的图像分割算法 2.图像边缘分割 3.图像阈值分割 4.基于区域的分割 5.形态学分水岭算法 多数的图像分割算法 均是基于灰度值的不连续和相似的性质.在 ...

  7. 直线段检测算法(LSD:a Line Segment Detector)

    直线段检测算法(LSD:a Line Segment Detector) 1 简介 LSD是一种线段检测算法,该方法能在较短的时间内获得较高精度的直线段检测结果. LSD直线检测算法首先计算图像中所有 ...

  8. 29 基于PCL的点云平面分割拟合算法技术路线(针对有噪声的点云数据)

    0 引言 最近项目中用到了基于PCL开发的基于平面的点云和CAD模型的配准算法,点云平面提取采用的算法如下. 1 基于PCL的点云平面分割拟合算法 2 参数及其意义介绍 (1)点云下采样 1. 参数: ...

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

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

最新文章

  1. 关于VC中的Timer
  2. 七大排序算法的个人总结(三)
  3. git push时提示:更新被拒绝,因为您当前分支的最新提交落后于其对应的远程分支
  4. 这次被问懵了!搞定了这些SQL优化技巧,下次横着走
  5. c语言结构体与共同体课件,《结构体与共同体》PPT课件.ppt
  6. arm oe linux gnueabi 系统,【技术分享】Quectel 4G模块Opencpu中实现高通wifi功能
  7. android插件式换肤,Android学习之插件化换肤
  8. SpringBoot集成MyBatis的分页插件PageHelper
  9. Centos 6.5 X64 环境下编译 hadoop 2.6.0 --已验证
  10. Log4j(二)—— Log4j基本使用方法
  11. Python实现(百度地图API)地理编码与逆地理编码
  12. PS制作一寸带白框的证件照
  13. 安全邮箱怎么注册?邮箱地址是什么?怎么写?快速了解tomvip邮箱
  14. 无线网络共享有线计算机,win10怎么把有线网络变成无线_win10如何共享有线网络为无线热点...
  15. connect to address IP: No route to host
  16. shell脚本:介绍、语法、运算、流程控制、对文件/输出流处理、案例
  17. 【计算机组成原理】 数据的表示和运算
  18. php fflush函数的用法,fflush 函数
  19. 数字音频总线A2B开发详解十一(A2B一Slave板做音效处理-31段EQ,高中低音分频,延时,3D音效等)
  20. 媒体邀约展会展览发布会新品发布企业邀请媒体官方直播媒体

热门文章

  1. poi 操作excel的处理
  2. Eclipse安装git插件以及关联导入GitHub项目
  3. python 第3天
  4. Redis的C++ client表、Json的C++ client表|汇总|大全
  5. Linux命令之cut详解
  6. 个性化你的IE,把你的名字刻在IE上!
  7. 风云的银光志Silverlight4.0教程之遍历访问客户端用户的本地文件
  8. Manjaro oh-my-zsh安装配置
  9. 微信机器人开发SDK使用教程--删除朋友圈
  10. php 5.0 新字符串