关于初始种子自动选取的区域生长实例(python+opencv)


Posted in Python onJanuary 16, 2020

算法中,初始种子可自动选择(通过不同的划分可以得到不同的种子,可按照自己需要改进算法),图分别为原图(自己画了两笔为了分割成不同区域)、灰度图直方图、初始种子图、区域生长结果图。

另外,不管时初始种子选择还是区域生长,阈值选择很重要。

import cv2
import numpy as np
import matplotlib.pyplot as plt

#初始种子选择
def originalSeed(gray, th):
 ret, thresh = cv2.cv2.threshold(gray, th, 255, cv2.THRESH_BINARY)#二值图,种子区域(不同划分可获得不同种子)
 kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3))#3×3结构元

 thresh_copy = thresh.copy() #复制thresh_A到thresh_copy
 thresh_B = np.zeros(gray.shape, np.uint8) #thresh_B大小与A相同,像素值为0

 seeds = [ ] #为了记录种子坐标

 #循环,直到thresh_copy中的像素值全部为0
 while thresh_copy.any():

  Xa_copy, Ya_copy = np.where(thresh_copy > 0) #thresh_A_copy中值为255的像素的坐标
  thresh_B[Xa_copy[0], Ya_copy[0]] = 255 #选取第一个点,并将thresh_B中对应像素值改为255

  #连通分量算法,先对thresh_B进行膨胀,再和thresh执行and操作(取交集)
  for i in range(200):
   dilation_B = cv2.dilate(thresh_B, kernel, iterations=1)
   thresh_B = cv2.bitwise_and(thresh, dilation_B)

  #取thresh_B值为255的像素坐标,并将thresh_copy中对应坐标像素值变为0
  Xb, Yb = np.where(thresh_B > 0)
  thresh_copy[Xb, Yb] = 0

  #循环,在thresh_B中只有一个像素点时停止
  while str(thresh_B.tolist()).count("255") > 1:
   thresh_B = cv2.erode(thresh_B, kernel, iterations=1) #腐蚀操作

  X_seed, Y_seed = np.where(thresh_B > 0) #取处种子坐标
  if X_seed.size > 0 and Y_seed.size > 0:
   seeds.append((X_seed[0], Y_seed[0]))#将种子坐标写入seeds
  thresh_B[Xb, Yb] = 0 #将thresh_B像素值置零
 return seeds

#区域生长
def regionGrow(gray, seeds, thresh, p):
 seedMark = np.zeros(gray.shape)
 #八邻域
 if p == 8:
  connection = [(-1, -1), (-1, 0), (-1, 1), (0, 1), (1, 1), (1, 0), (1, -1), (0, -1)]
 elif p == 4:
  connection = [(-1, 0), (0, 1), (1, 0), (0, -1)]

 #seeds内无元素时候生长停止
 while len(seeds) != 0:
  #栈顶元素出栈
  pt = seeds.pop(0)
  for i in range(p):
   tmpX = pt[0] + connection[i][0]
   tmpY = pt[1] + connection[i][1]

   #检测边界点
   if tmpX < 0 or tmpY < 0 or tmpX >= gray.shape[0] or tmpY >= gray.shape[1]:
    continue

   if abs(int(gray[tmpX, tmpY]) - int(gray[pt])) < thresh and seedMark[tmpX, tmpY] == 0:
    seedMark[tmpX, tmpY] = 255
    seeds.append((tmpX, tmpY))
 return seedMark


path = "_rg.jpg"
img = cv2.imread(path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#hist = cv2.calcHist([gray], [0], None, [256], [0,256])#直方图

seeds = originalSeed(gray, th=253)
seedMark = regionGrow(gray, seeds, thresh=3, p=8)

#plt.plot(hist)
#plt.xlim([0, 256])
#plt.show()
cv2.imshow("seedMark", seedMark)
cv2.waitKey(0)

关于初始种子自动选取的区域生长实例(python+opencv)

关于初始种子自动选取的区域生长实例(python+opencv)

关于初始种子自动选取的区域生长实例(python+opencv)

关于初始种子自动选取的区域生长实例(python+opencv)

以上这篇关于初始种子自动选取的区域生长实例(python+opencv)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现的批量下载RFC文档
Mar 10 Python
用Python的Django框架来制作一个RSS阅读器
Jul 22 Python
21行Python代码实现拼写检查器
Jan 25 Python
详细介绍Python的鸭子类型
Sep 12 Python
详解Python里使用正则表达式的ASCII模式
Nov 02 Python
Python实现改变与矩形橡胶的线条的颜色代码示例
Jan 05 Python
Python字典及字典基本操作方法详解
Jan 30 Python
Pandas之ReIndex重新索引的实现
Jun 25 Python
Python 实现平台类游戏添加跳跃功能
Mar 27 Python
Pyecharts地图显示不完成问题解决方案
May 11 Python
Python configparser模块操作代码实例
Jun 08 Python
Flask使用SQLAlchemy实现持久化数据
Jul 16 Python
Python简单实现区域生长方式
Jan 16 #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
You might like
PHP四舍五入、取整、round函数使用示例
2015/02/06 PHP
PHP获取远程图片并保存到本地的方法
2015/05/12 PHP
Symfony2函数用法实例分析
2016/03/18 PHP
javascript中的变量是传值还是传址的?
2010/04/19 Javascript
jQuery Deferred和Promise创建响应式应用程序详细介绍
2013/03/05 Javascript
基于JQuery 滑动与动画的说明介绍
2013/04/18 Javascript
js控制表单操作的常用代码小结
2013/08/15 Javascript
javascript获取url上某个参数的方法
2013/11/08 Javascript
JS小功能(offsetLeft实现图片滚动效果)实例代码
2013/11/28 Javascript
httpclient模拟登陆具体实现(使用js设置cookie)
2013/12/11 Javascript
基于jQuery实现复选框的全选 全不选 反选功能
2014/11/24 Javascript
值得分享的Bootstrap Ace模板实现菜单和Tab页效果
2015/12/30 Javascript
JS实现动态增加和删除li标签行的实例代码
2016/10/16 Javascript
AngularJS中使用ngModal模态框实例
2017/05/27 Javascript
详解angularjs中的隔离作用域理解以及绑定策略
2017/05/31 Javascript
详解JavaScript基础知识(JSON、Function对象、原型、引用类型)
2018/01/16 Javascript
详解javascript函数写法大全
2019/03/25 Javascript
JavaScript剩余操作符Rest Operator详解
2019/07/20 Javascript
vue中解决拖拽改变存在iframe的div大小时卡顿问题
2020/07/22 Javascript
[02:10]DOTA2 TI10勇士令状玩法及不朽Ⅰ展示:焕新世界,如你所期
2020/05/29 DOTA
python检查序列seq是否含有aset中项的方法
2015/06/30 Python
python实现微信接口(itchat)详细介绍
2017/10/23 Python
Django model反向关联名称的方法
2018/12/15 Python
Python OS模块实例详解
2019/04/15 Python
浅谈Pandas Series 和 Numpy array中的相同点
2019/06/28 Python
基于Tensorflow高阶读写教程
2020/02/10 Python
利用Python pandas对Excel进行合并的方法示例
2020/11/04 Python
python 简单的调用有道翻译
2020/11/25 Python
Hotels.com中国区:好订网
2016/08/18 全球购物
阿迪达斯比利时官方商城:adidas比利时
2016/10/10 全球购物
违反学校规定检讨书
2014/01/18 职场文书
少先队学雷锋活动总结范文
2014/03/09 职场文书
2014最新毕业证代领委托书
2014/09/26 职场文书
暑假社会实践证明格式
2014/10/28 职场文书
详解JS WebSocket断开原因和心跳机制
2021/05/07 Javascript
Vertica集成Apache Hudi重磅使用指南
2022/03/31 Servers