关于初始种子自动选取的区域生长实例(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之模拟鼠标键盘动作具体实现
Dec 30 Python
python3.4用函数操作mysql5.7数据库
Jun 23 Python
python2和python3实现在图片上加汉字的方法
Aug 22 Python
Python切图九宫格的实现方法
Oct 10 Python
python找出列表中大于某个阈值的数据段示例
Nov 24 Python
Python谱减法语音降噪实例
Dec 18 Python
Python实现图片识别加翻译功能
Dec 26 Python
Python安装tar.gz格式文件方法详解
Jan 19 Python
PyCharm常用配置和常用插件(小结)
Feb 06 Python
用Python爬虫破解滑动验证码的案例解析
May 06 Python
Python面向对象之内置函数相关知识总结
Jun 24 Python
使用pandas生成/读取csv文件的方法实例
Jul 09 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中获得视频时间总长度的另一种方法
2011/09/15 PHP
关于PHP实现异步操作的研究
2013/02/03 PHP
PHP远程调试之XDEBUG
2015/12/29 PHP
javascript-TreeView父子联动效果保持节点状态一致
2007/08/12 Javascript
javascript dom 基本操作小结
2010/04/11 Javascript
js中用window.open()打开多个窗口的name问题
2014/03/13 Javascript
jQuery 取值、赋值的基本方法整理
2014/03/31 Javascript
JQuery查找DOM节点的方法
2015/06/11 Javascript
基于jquery实现瀑布流布局
2020/06/28 Javascript
JS+HTML5手机开发之滚动和惯性缓动实现方法分析
2016/06/12 Javascript
javascript实现Emrips反质数枚举的示例代码
2017/12/06 Javascript
Vue表单及表单绑定方法
2018/09/04 Javascript
vue项目持久化存储数据的实现代码
2018/10/01 Javascript
Vue+Express实现登录注销功能的实例代码
2019/05/05 Javascript
微信小程序实现文件、图片上传功能
2020/08/18 Javascript
基于jQuery实现挂号平台首页源码
2020/01/06 jQuery
JavaScript 禁止用户保存图片的实现代码
2020/04/28 Javascript
uniapp实现可以左右滑动导航栏
2020/10/21 Javascript
JavaScript动态生成表格的示例
2020/11/02 Javascript
[03:07]DOTA2英雄基础教程 冰霜诅咒极寒幽魂
2013/12/06 DOTA
Python通过正则表达式选取callback的方法
2015/07/18 Python
django批量导入xml数据
2016/10/16 Python
Python实现按中文排序的方法示例
2018/04/25 Python
python 读取目录下csv文件并绘制曲线v111的方法
2018/07/06 Python
opencv python 基于KNN的手写体识别的实例
2018/08/03 Python
详解python:time模块用法
2019/03/25 Python
Python实现AI换脸功能
2020/04/10 Python
在spyder IPython console中,运行代码加入参数的实例
2020/04/20 Python
Python xlrd模块导入过程及常用操作
2020/06/10 Python
Python函数递归调用实现原理实例解析
2020/08/11 Python
深入解析HTML5 Canvas控制图形矩阵变换的方法
2016/03/24 HTML / CSS
一些关于MySql加速和优化的面试题
2014/01/30 面试题
战友聚会邀请函
2014/01/18 职场文书
优秀毕业生自荐信
2014/06/10 职场文书
报案材料怎么写
2015/05/25 职场文书
从np.random.normal()到正态分布的拟合操作
2021/06/02 Python