关于初始种子自动选取的区域生长实例(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爬虫之urllib2使用指南
Nov 05 Python
Python for Informatics 第11章 正则表达式(一)
Apr 21 Python
Python抓取框架 Scrapy的架构
Aug 12 Python
django反向解析URL和URL命名空间的方法
Jun 05 Python
python中的二维列表实例详解
Jun 19 Python
python random从集合中随机选择元素的方法
Jan 23 Python
Python根据当前日期取去年同星期日期
Apr 14 Python
总结Python图形用户界面和游戏开发知识点
May 22 Python
Django使用 Bootstrap 样式修改书籍列表过程解析
Aug 09 Python
Django框架ORM数据库操作实例详解
Nov 07 Python
Python实现简单的2048小游戏
Mar 01 Python
Python使用scapy模块发包收包
May 07 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
如何做到多笔资料的同步
2006/10/09 PHP
用php实现让页面只能被百度gogole蜘蛛访问的方法
2009/12/29 PHP
PHP简洁函数小结
2011/08/12 PHP
php 带逗号千位符数字的处理方法
2012/01/10 PHP
利用php_imagick实现复古效果的方法
2016/10/18 PHP
PHP智能识别收货地址信息实例
2019/01/05 PHP
JavaScript中的常见问题解决方法(乱码,IE缓存,代理)
2013/11/28 Javascript
jQuery实现数字加减效果汇总
2014/12/16 Javascript
javascript模拟评分控件实现方法
2015/05/13 Javascript
JS清除文本框内容离开在恢复及鼠标离开文本框时触发js的方法
2016/01/12 Javascript
基于NodeJS+MongoDB+AngularJS+Bootstrap开发书店案例分析
2017/01/12 NodeJs
Angular6封装http请求的步骤详解
2018/08/13 Javascript
理顺8个版本vue的区别(小结)
2018/09/17 Javascript
解决Vue.js应用回退或刷新界面时提示用户保存修改问题
2019/11/24 Javascript
详解uniapp的全局变量实现方式
2021/01/11 Javascript
python基于mysql实现的简单队列以及跨进程锁实例详解
2014/07/07 Python
使用Python读写文本文件及编写简单的文本编辑器
2016/03/11 Python
Python简单实现TCP包发送十六进制数据的方法
2016/04/16 Python
Python的Twisted框架上手前所必须了解的异步编程思想
2016/05/25 Python
Python元组操作实例分析【创建、赋值、更新、删除等】
2017/07/24 Python
浅谈python中统计计数的几种方法和Counter详解
2019/11/07 Python
Python flask框架实现浏览器点击自定义跳转页面
2020/06/04 Python
欧洲领先的电子和电信零售商和服务提供商:Currys PC World Business
2017/12/05 全球购物
如何利用find命令查找文件
2015/02/07 面试题
经理秘书找工作求职信
2013/12/19 职场文书
财务会计人员求职的自我评价
2014/01/13 职场文书
护士自我评价范文
2014/01/25 职场文书
党员自我批评与反省材料
2014/02/10 职场文书
《绿色蝈蝈》教学反思
2014/03/02 职场文书
卖车协议书
2014/04/21 职场文书
2015纪念九一八事变84周年演讲稿
2015/03/19 职场文书
考研导师推荐信范文
2015/03/27 职场文书
超市收银员岗位职责
2015/04/07 职场文书
nginx常用命令放入shell脚本详解
2021/03/31 Servers
使用Selenium实现微博爬虫(预登录、展开全文、翻页)
2021/04/13 Python
Navicat Premium自定义 sql 标签的创建方式
2022/09/23 数据库