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通过加号运算符操作列表的方法
Jul 28 Python
Python如何判断数独是否合法
Sep 08 Python
Python获取某一天是星期几的方法示例
Jan 17 Python
Python实现网站注册验证码生成类
Jun 08 Python
Python与人工神经网络:使用神经网络识别手写图像介绍
Dec 19 Python
理论讲解python多进程并发编程
Feb 09 Python
Python将文本去空格并保存到txt文件中的实例
Jul 24 Python
python将字符串转换成json的方法小结
Jul 09 Python
python字符串分割及字符串的一些常规方法
Jul 24 Python
基于Django实现日志记录报错信息
Dec 17 Python
tensorflow查看ckpt各节点名称实例
Jan 21 Python
python闭包与引用以及需要注意的陷阱
Sep 18 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 巧用数组降低程序的时间复杂度
2010/01/01 PHP
destoon会员注册提示“数据校验失败(2)”解决方法
2014/06/21 PHP
javascript parseInt 函数分析(转)
2009/03/21 Javascript
javascript采用数组实现tab菜单切换效果
2012/12/12 Javascript
利用jquery包将字符串生成二维码图片
2013/09/12 Javascript
Jquery each方法跳出循环,并获取返回值(实例讲解)
2013/12/12 Javascript
gridview生成时如何去掉style属性中的border-collapse
2014/09/30 Javascript
node.js中的fs.fstatSync方法使用说明
2014/12/15 Javascript
jquery仿京东侧边栏导航效果
2017/03/02 Javascript
vue引用js文件的多种方式(推荐)
2018/05/17 Javascript
Vue.use源码学习小结
2018/06/20 Javascript
[01:02:02]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第二局
2016/02/25 DOTA
[01:20:38]完美世界DOTA2联赛 GXR vs IO 第一场 11.07
2020/11/09 DOTA
python实现朴素贝叶斯分类器
2018/03/28 Python
tensorflow使用神经网络实现mnist分类
2018/09/08 Python
在Python中增加和插入元素的示例
2018/11/01 Python
python读取txt文件中特定位置字符的方法
2018/12/24 Python
浅谈python标准库--functools.partial
2019/03/13 Python
python 命令行传入参数实现解析
2019/08/30 Python
Django学习之文件上传与下载
2019/10/06 Python
python模拟点击网页按钮实现方法
2020/02/25 Python
深入CSS3 动画效果的总结详解
2013/05/09 HTML / CSS
世界领先的以旅馆为主的在线预订平台:Hostelworld
2016/10/09 全球购物
俄罗斯香水和化妆品在线商店:Aroma-butik
2020/02/28 全球购物
说说你所熟悉或听说过的j2ee中的几种常用模式?及对设计模式的一些看法
2012/05/24 面试题
武汉瑞得软件笔试题
2015/10/27 面试题
自荐信格式技巧有哪些呢
2013/11/19 职场文书
暑假安全教育广播稿
2014/09/10 职场文书
财务人员岗位职责
2015/02/03 职场文书
支行行长岗位职责
2015/02/15 职场文书
向雷锋同志学习倡议书
2015/04/27 职场文书
MySQL InnoDB ReplicaSet(副本集)简单介绍
2021/04/24 MySQL
Redis 配置文件重要属性的具体使用
2021/05/20 Redis
如何利用Python实现n*n螺旋矩阵
2022/01/18 Python
分享Python获取本机IP地址的几种方法
2022/03/17 Python