关于初始种子自动选取的区域生长实例(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中文问题解决方法(总结了多位前人经验,初学者必看)
Mar 13 Python
python list转dict示例分享
Jan 28 Python
web.py中调用文件夹内模板的方法
Aug 26 Python
linux 下实现python多版本安装实践
Nov 18 Python
Python3实现从文件中读取指定行的方法
May 22 Python
python日志记录模块实例及改进
Feb 12 Python
python 时间信息“2018-02-04 18:23:35“ 解析成字典形式的结果代码详解
Apr 19 Python
点球小游戏python脚本
May 22 Python
详解Python3 对象组合zip()和回退方式*zip
May 15 Python
vue学习笔记之动态组件和v-once指令简单示例
Feb 29 Python
python实现3D地图可视化
Mar 25 Python
详解如何使用Pytest进行自动化测试
Jan 14 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
Yii2针对指定url的生成及图片等的引入方法小结
2016/07/18 PHP
PHP全功能无变形图片裁剪操作类与用法示例
2017/01/10 PHP
php实现文件上传及头像预览功能
2017/01/15 PHP
redis+php实现微博(三)微博列表功能详解
2019/09/23 PHP
你需要知道的10个最佳javascript开发实践小结
2012/04/15 Javascript
js闭包的用途详解
2014/11/09 Javascript
jquery.mobile 共同布局遇到的问题小结
2015/02/10 Javascript
JavaScript中Date.toSource()方法的使用教程
2015/06/12 Javascript
纯javascript实现自动发送邮件
2015/10/21 Javascript
跟我学习javascript的循环
2015/11/18 Javascript
js实现仿微博滚动显示信息的效果
2015/12/21 Javascript
javascript与jquery动态创建html元素示例
2016/07/25 Javascript
Node.js检测端口(port)是否被占用的简单示例
2016/09/29 Javascript
JavaScript 身份证号有效验证详解及实例代码
2016/10/20 Javascript
基于JS快速实现导航下拉菜单动画效果附源码下载
2016/10/27 Javascript
详解nodejs 文本操作模块-fs模块(二)
2016/12/22 NodeJs
基于node.js express mvc轻量级框架实践
2017/09/14 Javascript
详解利用 Express 托管静态文件的方法
2017/09/18 Javascript
r.js来合并压缩css文件的示例
2018/04/26 Javascript
原生JS实现$.param() 函数的方法
2018/08/10 Javascript
vue打包相关细节整理(小结)
2018/09/28 Javascript
js中的数组对象排序分析
2018/12/11 Javascript
JavaScript如何操作css
2020/10/24 Javascript
python实现指定字符串补全空格的方法
2015/04/30 Python
简单介绍Python中的try和finally和with方法
2015/05/05 Python
python 性能优化方法小结
2017/03/31 Python
Python使用APScheduler实现定时任务过程解析
2019/09/11 Python
Python 使用type来定义类的实现
2019/11/19 Python
tensorflow模型继续训练 fineturn实例
2020/01/21 Python
pycharm 对代码做静态检查操作
2020/06/09 Python
Hello Molly美国:女性时尚在线
2019/08/26 全球购物
人事主管的岗位职责
2013/11/16 职场文书
测试工程师岗位职责
2013/11/28 职场文书
放飞蜻蜓反思
2014/02/05 职场文书
本科生导师推荐信范文
2014/05/18 职场文书
2015年主婚人婚礼致辞
2015/07/28 职场文书