Python简单实现区域生长方式


Posted in Python onJanuary 16, 2020

区域生长是一种串行区域分割的图像分割方法。区域生长是指从某个像素出发,按照一定的准则,逐步加入邻近像素,当满足一定的条件时,区域生长终止。区域生长的好坏决定于1.初始点(种子点)的选取。2.生长准则。3.终止条件。区域生长是从某个或者某些像素点出发,最后得到整个区域,进而实现目标的提取。

区域生长的原理:   

区域生长的基本思想是将具有相似性质的像素集合起来构成区域。具体先对每个需要分割的区域找一个种子像素作为生长起点,然后将种子像素和周围邻域中与种子像素有相同或相似性质的像素(根据某种事先确定的生长或相似准则来判定)合并到种子像素所在的区域中。将这些新像素当作新的种子继续上面的过程,直到没有满足条件的像素可被包括进来。这样一个区域就生长成了。

区域生长实现的步骤如下:

1. 对图像顺序扫描!找到第1个还没有归属的像素, 设该像素为(x0, y0);

2. 以(x0, y0)为中心, 考虑(x0, y0)的4邻域像素(x, y)如果(x0, y0)满足生长准则, 将(x, y)与(x0, y0)合并(在同一区域内), 同时将(x, y)压入堆栈;

3. 从堆栈中取出一个像素, 把它当作(x0, y0)返回到步骤2;

4. 当堆栈为空时!返回到步骤1;

5. 重复步骤1 - 4直到图像中的每个点都有归属时。生长结束。

Python实现

import numpy as np
import cv2

class Point(object):
 def __init__(self,x,y):
  self.x = x
  self.y = y

 def getX(self):
  return self.x
 def getY(self):
  return self.y

def getGrayDiff(img,currentPoint,tmpPoint):
 return abs(int(img[currentPoint.x,currentPoint.y]) - int(img[tmpPoint.x,tmpPoint.y]))

def selectConnects(p):
 if p != 0:
  connects = [Point(-1, -1), Point(0, -1), Point(1, -1), Point(1, 0), Point(1, 1), \
     Point(0, 1), Point(-1, 1), Point(-1, 0)]
 else:
  connects = [ Point(0, -1), Point(1, 0),Point(0, 1), Point(-1, 0)]
 return connects

def regionGrow(img,seeds,thresh,p = 1):
 height, weight = img.shape
 seedMark = np.zeros(img.shape)
 seedList = []
 for seed in seeds:
  seedList.append(seed)
 label = 1
 connects = selectConnects(p)
 while(len(seedList)>0):
  currentPoint = seedList.pop(0)

  seedMark[currentPoint.x,currentPoint.y] = label
  for i in range(8):
   tmpX = currentPoint.x + connects[i].x
   tmpY = currentPoint.y + connects[i].y
   if tmpX < 0 or tmpY < 0 or tmpX >= height or tmpY >= weight:
    continue
   grayDiff = getGrayDiff(img,currentPoint,Point(tmpX,tmpY))
   if grayDiff < thresh and seedMark[tmpX,tmpY] == 0:
    seedMark[tmpX,tmpY] = label
    seedList.append(Point(tmpX,tmpY))
 return seedMark


img = cv2.imread('lean.png',0)
seeds = [Point(10,10),Point(82,150),Point(20,300)]
binaryImg = regionGrow(img,seeds,10)
cv2.imshow(' ',binaryImg)
cv2.waitKey(0)

以上这篇Python简单实现区域生长方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python遍历zip文件输出名称时出现乱码问题的解决方法
Apr 08 Python
使用Python编写一个简单的tic-tac-toe游戏的教程
Apr 16 Python
python获得linux下所有挂载点(mount points)的方法
Apr 29 Python
Python的Django中django-userena组件的简单使用教程
May 30 Python
Python编程中使用Pillow来处理图像的基础教程
Nov 20 Python
Python:Scrapy框架中Item Pipeline组件使用详解
Dec 27 Python
Pycharm 创建 Django admin 用户名和密码的实例
May 30 Python
Django中的Model操作表的实现
Jul 24 Python
创建Shapefile文件并写入数据的例子
Nov 26 Python
如何基于Python创建目录文件夹
Dec 31 Python
python实现简单飞行棋
Feb 06 Python
用python批量下载apk
Dec 29 Python
python3.8与pyinstaller冲突问题的快速解决方法
Jan 16 #Python
Pycharm中Python环境配置常见问题解析
Jan 16 #Python
Python Numpy库常见用法入门教程
Jan 16 #Python
Python使用Pandas库常见操作详解
Jan 16 #Python
Python 日期的转换及计算的具体使用详解
Jan 16 #Python
Python使用循环神经网络解决文本分类问题的方法详解
Jan 16 #Python
win10安装tesserocr配置 Python使用tesserocr识别字母数字验证码
Jan 16 #Python
You might like
php利用curl抓取新浪微博内容示例
2014/04/27 PHP
Laravel5.0+框架邮件发送功能实现方法图文与实例详解
2019/04/23 PHP
JQuery中SetTimeOut传参问题探讨
2013/05/10 Javascript
js中匿名函数的创建与调用方法分析
2014/12/19 Javascript
jquery实现无限分级横向导航菜单的方法
2015/03/12 Javascript
动态加载jQuery的两种方法实例分析
2015/07/17 Javascript
js匿名函数作为函数参数详解
2016/06/01 Javascript
Bootstrap警告(Alerts)的实现方法
2017/03/22 Javascript
一次围绕setTimeout的前端面试经验分享
2017/06/15 Javascript
JavaScript中document.referrer的用法详解
2017/07/04 Javascript
JavaScript判断浏览器和hack滚动条的写法
2017/07/23 Javascript
纯js代码生成可搜索选择下拉列表的实例
2018/01/11 Javascript
js实现json数组分组合并操作示例
2019/02/12 Javascript
微信小程序上传文件到阿里OSS教程
2019/05/20 Javascript
vue vant中picker组件的使用
2020/11/03 Javascript
python函数参数*args**kwargs用法实例
2013/12/04 Python
Python按钮的响应事件详解
2019/03/04 Python
Python+OpenCV+图片旋转并用原底色填充新四角的例子
2019/12/12 Python
Matplotlib scatter绘制散点图的方法实现
2020/01/02 Python
Python3基本输入与输出操作实例分析
2020/02/14 Python
python画环形图的方法
2020/03/25 Python
python matplotlib实现将图例放在图外
2020/04/17 Python
keras实现多GPU或指定GPU的使用介绍
2020/06/17 Python
Python代码覆盖率统计工具coverage.py用法详解
2020/11/25 Python
CSS 3.0文字悬停跳动特效代码
2020/10/26 HTML / CSS
HTML5之多线程(Web Worker)
2019/01/02 HTML / CSS
什么叫应用程序域?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?
2012/05/23 面试题
财务管理专业应届毕业生求职信
2013/09/22 职场文书
幼儿园实习自我鉴定
2013/12/15 职场文书
计算机专业毕业生求职信分享
2013/12/24 职场文书
服务承诺口号
2014/05/22 职场文书
意外伤害赔偿协议书
2014/09/16 职场文书
教师自荐信范文
2015/03/06 职场文书
八年级作文之我的母亲
2019/12/10 职场文书
Redis做数据持久化的解决方案及底层原理
2021/07/15 Redis
一文搞懂MySQL索引页结构
2022/02/28 MySQL