Python简单实现区域生长方式
作者:小大小丑 发布时间:2023-08-08 12:07:38
标签: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 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)
来源:https://blog.csdn.net/bagboy_taobao_com/article/details/5666091


猜你喜欢
- 前言大家都知道,早期的XMLHttpRequest不支持文件上传,一般用第三方js插件或者flash,现在可以借助XMLHttpReques
- 1.简介keplergl是由Uber开源的一款地理数据可视化工具,通过keplergl我们可以在Jupyter notebook中使用,可视
- 需求在4*4的图片中,比较外围黑色像素点和内圈黑色像素点个数的大小将图片分类如上图图片外围黑色像素点5个大于内圈黑色像素点1个分为0类反之1
- MySQL 字符编码集中有两套 UTF-8 编码实现:utf8 和 utf8mb4。如果使用 utf8 的话,存储 emoji 符号和一些比
- asp三天学好ADO对象之第一天 今天说一下Recordset 对象的属性1、CursorType 属性AdOpenForwardOnly:
- numpy的sum函数可接受的参数是:sum(a, axis=None, dtype=None, out=None, keepdims=np
- 本文实例为大家分享了mysql 5.7.13 winx64安装配置方法图文教程,供大家参考,具体内容如下(1) 下载MySQL程序,您可以从
- 理由:jquery简单,兼容性好且容易封装。废话不多说,马上开始我们的Jquery插件编写吧。应该有很多人写过类似的插件,我也是有些模仿fl
- 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。以下文章来源于早起Python ,作者投
- 本文实例讲述了python实现string和dict的相互转换方法。分享给大家供大家参考,具体如下:字典(dict)转为字符串(string
- 详解python里使用正则表达式的分组命名方式分组匹配的模式,可以通过groups()来全部访问匹配的元组,也可以通过group()函数来按
- Django RBAC权限管理概述RBAC(Role-Based Access Control,基于角色的访问控制),通过角色绑定权限,然后
- 摘要在上一篇文章,时间日期处理的入门里面,我们简单介绍了一下载pandas里对时间日期的简单操作。下面将补充一些常用方法。时间日期的比较假设
- 【方法一】: 通过setuptools来安装python模块首先下载 http://peak.telecommunity.com/dist/
- 一、pyqt5的UI中嵌入matplotlib的方法1、导入模块导入模块比较简单,首先声明使用pyqt5,通过FigureCanvasQTA
- 作者:做梦的人(小姐姐)出处:https://www.cnblogs.com/chongyou/因为最近在做平台,发现有同事,使用djang
- 如何修改数据库名(db_name)及实例名(Instance_name or Service_name) Nid是Oracle从9iR2开始
- 前言我们将利用 Beautiful Soup 模块的搜索功能,根据标签名称、标签属性、文档文本和正则表达式来搜索。搜索方法Beautiful
- 本文实例讲述了python版本的读写锁操作方法。分享给大家供大家参考,具体如下:最近要用到读写锁的机制,但是python2.7的自带库里居然
- 一: 删除LOG1:分离数据库 企业管理器->服务器->数据库->右键->分离数据库2:删除LOG文件3:附加数据库 企业管理器->服务器-