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字符串匹配算法KMP实例
Jul 18 Python
Python迭代和迭代器详解
Nov 10 Python
Python中模块pymysql查询结果后如何获取字段列表
Jun 05 Python
Python字典数据对象拆分的简单实现方法
Dec 05 Python
Flask web开发处理POST请求实现(登录案例)
Jul 26 Python
详解pandas库pd.read_excel操作读取excel文件参数整理与实例
Feb 17 Python
python爬虫基础教程:requests库(二)代码实例
Apr 09 Python
用uWSGI和Nginx部署Flask项目的方法示例
May 05 Python
Python math库 ln(x)运算的实现及原理
Jul 17 Python
Python解析命令行读取参数之argparse模块
Jul 26 Python
使用python批量修改XML文件中图像的depth值
Jul 22 Python
五种Python转义表示法
Nov 27 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
追忆往昔!浅谈收音机的百年发展历史
2021/03/01 无线电
PHP实现批量上传单个文件
2015/12/29 PHP
php arsort 数组降序排序详细介绍
2016/11/17 PHP
javascript实现仿银行密码输入框效果的代码
2007/12/13 Javascript
JQuery上传插件Uploadify使用详解及错误处理
2010/04/27 Javascript
基于jQuery的淡入淡出可自动切换的幻灯插件打包下载
2010/09/15 Javascript
JavaScript截取字符串的2个函数介绍
2014/08/27 Javascript
基于jQuery和CSS3制作响应式水平时间轴附源码下载
2015/12/20 Javascript
javascript的理解及经典案例分析
2016/05/20 Javascript
jQuery页面加载初始化的3种方法(推荐)
2016/06/02 Javascript
js微信支付实现代码
2016/12/22 Javascript
微信小程序 常见问题总结(4058,40013)及解决办法
2017/01/11 Javascript
js原生Ajax的封装和原理详解
2017/03/11 Javascript
浅谈webpack 构建性能优化策略小结
2018/06/13 Javascript
微信小程序:数据存储、传值、取值详解
2019/05/07 Javascript
layui实现左侧菜单点击右侧内容区显示
2019/07/26 Javascript
跟老齐学Python之眼花缭乱的运算符
2014/09/14 Python
Python实现曲线点抽稀算法的示例
2017/10/12 Python
Python基于PyGraphics包实现图片截取功能的方法
2017/12/21 Python
python利用百度AI实现文字识别功能
2018/11/27 Python
解决webdriver.Chrome()报错:Message:'chromedriver' executable needs to be in Path
2019/06/12 Python
Django REST Framework序列化外键获取外键的值方法
2019/07/26 Python
Python线程指南分享
2019/11/19 Python
Python如何获取Win7,Win10系统缩放大小
2020/01/10 Python
Python实现CAN报文转换工具教程
2020/05/05 Python
解决Keras 中加入lambda层无法正常载入模型问题
2020/06/16 Python
Python中logging日志的四个等级和使用
2020/11/17 Python
C#如何允许一个类被继承但是避免这个类的方法被重载?
2015/02/24 面试题
写好自荐信的几个要点
2013/12/26 职场文书
幼儿教师考核制度
2014/01/25 职场文书
美容院营销方案
2014/03/05 职场文书
乡镇党的群众路线教育实践活动总结报告
2014/10/30 职场文书
2014年安全员工作总结
2014/11/13 职场文书
优秀党员个人总结
2015/02/14 职场文书
Android存储中最基本的文件存储方式
2022/04/30 Java/Android
MySQL中dd::columns表结构转table过程及应用详解
2022/09/23 MySQL