关于初始种子自动选取的区域生长实例(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 保存float类型的小数的位数方法
Oct 17 Python
对Python中plt的画图函数详解
Nov 07 Python
通过python的matplotlib包将Tensorflow数据进行可视化的方法
Jan 09 Python
详解Python中正则匹配TAB及空格的小技巧
Jul 26 Python
Django models.py应用实现过程详解
Jul 29 Python
python打印文件的前几行或最后几行教程
Feb 13 Python
什么是Python中的顺序表
Jun 02 Python
Python Django中间件使用原理及流程分析
Jun 13 Python
keras topN显示,自编写代码案例
Jul 03 Python
pycharm 复制代码出现空格的解决方式
Jan 15 Python
Python机器学习三大件之一numpy
May 10 Python
ROS系统将python包编译为可执行文件的简单步骤
Jul 25 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新手NOTICE错误常见解决方法
2011/12/07 PHP
file_get_contents获取不到网页内容的解决方法
2013/03/07 PHP
PHP模板引擎Smarty内建函数section,sectionelse用法详解
2016/04/11 PHP
PHP检查网站是否宕机的方法示例
2017/07/24 PHP
PHP中cookie知识点学习
2018/05/06 PHP
Laravel 模型使用软删除-左连接查询-表起别名示例
2019/10/24 PHP
两个SUBMIT按钮,如何区分处理
2006/08/22 Javascript
动态加载dtree.js树treeview(示例代码)
2013/12/17 Javascript
javascript中数组的多种定义方法和常用函数简介
2014/05/09 Javascript
nodejs中的fiber(纤程)库详解
2015/03/24 NodeJs
jQuery控制元素显示、隐藏、切换、滑动的方法总结
2015/04/16 Javascript
jquery ajax双击div可直接修改div中的内容
2016/03/04 Javascript
JS中传递参数的几种不同方法比较
2017/01/20 Javascript
AngularJS自定义指令详解(有分页插件代码)
2017/06/12 Javascript
jQuery实现简单的手风琴效果
2020/04/17 jQuery
详解Vue.js项目API、Router配置拆分实践
2018/03/16 Javascript
nodejs 简单实现动态html的方法
2018/05/12 NodeJs
vue2 v-model/v-text 中使用过滤器的方法示例
2019/05/09 Javascript
JavaScript设计模式--简单工厂模式定义与应用案例详解
2020/05/23 Javascript
微信小程序实现canvas分享朋友圈海报
2020/06/21 Javascript
jQuery实现计算器功能
2020/10/19 jQuery
对比Python中__getattr__和 __getattribute__获取属性的用法
2016/06/21 Python
Python爬虫DNS解析缓存方法实例分析
2017/06/02 Python
python3 tkinter实现添加图片和文本
2019/11/26 Python
Python实现投影法分割图像示例(二)
2020/01/17 Python
python 轮询执行某函数的2种方式
2020/05/03 Python
Python使用Turtle模块绘制国旗的方法示例
2021/02/28 Python
css3+伪元素实现鼠标移入时下划线向两边展开的效果
2017/04/25 HTML / CSS
adidas菲律宾官网:adidas PH
2020/02/07 全球购物
应届毕业生简历自我评价
2014/01/31 职场文书
大学生就业意向书范文
2014/04/01 职场文书
学历公证书范本
2014/04/09 职场文书
理发店策划方案
2014/06/05 职场文书
“九一八事变纪念日”国旗下讲话稿
2014/09/14 职场文书
2014年标准化工作总结
2014/12/17 职场文书
师德培训心得体会2016
2016/01/09 职场文书