Python简单实现区域生长
区域生长是一种串行区域分割的图像分割方法。区域生长是指从某个像素出发,按照一定的准则,逐步加入邻近像素,当满足一定的条件时,区域生长终止。区域生长的好坏决定于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 cv2class Point(object):def __init__(self,x,y):self.x = xself.y = ydef getX(self):return self.xdef getY(self):return self.ydef 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 connectsdef regionGrow(img,seeds,thresh,p = 1):height, weight = img.shapeseedMark = 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] = labelfor i in range(8):tmpX = currentPoint.x + connects[i].xtmpY = currentPoint.y + connects[i].yif 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] = labelseedList.append(Point(tmpX,tmpY))return seedMarkimg = 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)
参考博客 https://blog.csdn.net/bagboy_taobao_com/article/details/5666091
Python简单实现区域生长相关推荐
- python中年大叔学编程_中年大叔学编程-Python简单操作文件
原标题:中年大叔学编程-Python简单操作文件 在计算机中,经常打交道的就是各种文档,用得比较多的软件就是office和记事本来操作文件,那么我们试试用Python来简单读写文件. Open函数的用 ...
- (一)python简单应用
(一)python简单应用 自学之后运用循环语句和判断语句所解决的几个简单问题: 1.实现1到10的和: x = 1 he = 0 while x < 11:if x == 7:passelse ...
- python 简单图像处理(13) 二值图腐蚀和膨胀,开运算、闭运算
原文:http://www.cnblogs.com/xianglan/archive/2010/12/29/1921211.html python 简单图像处理(13) 二值图腐蚀和膨胀,开运算.闭运 ...
- python好学-所有人都说Python 简单易学,为何你觉得难?
记得刚学Python的时候,几乎所有人都说Python 简单易学,而对于编程零基础,只掌握Word和Excel的人来说,感觉真的好难. 学习之前网上的教材看了,Python的书也看了,包括<核心 ...
- python基础代码事例-Python简单基础小程序的实例代码
1 九九乘法表 for i in range(9):#从0循环到8 i += 1#等价于 i = i+1 for j in range(i):#从0循环到i j += 1 print(j,'*',i, ...
- python程序实例教程基础-Python简单基础小程序的实例代码
1 九九乘法表 for i in range(9):#从0循环到8 i += 1#等价于 i = i+1 for j in range(i):#从0循环到i j += 1 print(j,'*',i, ...
- Python 简单入门指北(二)
Python 简单入门指北(二) 2 函数 2.1 函数是一等公民 一等公民指的是 Python 的函数能够动态创建,能赋值给别的变量,能作为参传给函数,也能作为函数的返回值.总而言之,函数和普通变量 ...
- Python简单主机批量管理工具
Python简单主机批量管理工具 一.程序介绍 需求: 简单主机批量管理工具需求:1.主机分组2.主机信息使用配置文件3.可批量执行命令.发送文件,结果实时返回4.主机用户名密码.端口可以不同5.执行 ...
- Python简单遍历字典及删除元素的方法
Python简单遍历字典及删除元素的方法 这篇文章主要介绍了Python简单遍历字典及删除元素的方法,结合实例形式分析了Python遍历字典删除元素的操作方法与相关注意事项,需要的朋友可以参考下 具体 ...
最新文章
- node编写定时任务,for循环只执行一遍的解决办法
- DockerSwarm 微服务部署
- 关于机器学习的领悟与反思
- 第二篇:白话tornado源码之待请求阶段
- 海量数据库解决方案2011030401
- android 测试 大赛,轻量级android应用自动测试工具-2017全国大学生软件测试大赛.pdf...
- django 数据库中中文转化为汉语拼音
- jQuery获取input复选框的值
- 产品经理网站数据分析之测量问题现状(二)
- Struts2学习(四):Action执行的时候发生了什么
- RocketMQ之事务消息
- Vue 中的 v-cloak 作用及用法
- 深度学习图像分割(一)——PASCAL-VOC2012数据集(vocdevkit、Vocbenchmark_release)详细介绍
- xenu死链检测工具使用教程
- positionViewHolder{a1bbfa3 position=2 id=-1, oldPos=-1, pLpos:-1 no parent}
- RK3399触摸不准,修改drivers中gt9xx.h的cfg
- 百度地图:创建多个标注点
- 质点系的牛顿-欧拉动力学方程
- ant design 地区选择(级联)
- 转换英文货币大小写的代码