文章目录

  • 1 环境
  • 2 效果
  • 3 原理
  • 4 案例

1 环境

  • Python 3.8.8
  • PyCharm 2021
  • opencv-python

2 效果


3 原理

  区域生长的基本思想是将具有相似性质的像素集合起来构成区域。具体先对每个需要分割的区域找一个种子像素作为生长的起点,然后将种子像素周围邻域中与种子像素具有相同或相似性质的像素(根据某种事先确定的生长或相似准则来判定)合并到种子像素所在的区域中。将这些新像素当做新的种子像素继续进行上面的过程,直到再没有满足条件的像素可被包括进来,这样,一个区域就长成了。
  区域生长的算法实现:

  • 根据图像的不同应用选择一个或一组种子,它或者是最亮或最暗的点,或者是位于点簇中心的点,当然也可以手动选择种子点。
  • 选择一个描述符(条件),常见的有基于区域灰度差、基于区域灰度分布统计性质。
  • 从该种子开始向外扩张,首先把种子像素加入结果集合,然后不断将与集合中各个像素连通、且满足描述符的像素加入集合。
  • 上一过程进行到不再有满足条件的新结点加入集合为止。

4 案例

  本次案例采用了一张医学图像,为肺部 CT 图像,提取肺的轮廓以判断肺的健康性。


实现的主要流程如下:

  • 读入CT图片,让图片和鼠标进行交互,在三个位置进行左击鼠标生成三个红点,保存每次点击时的 (y,x)(y,x)(y,x) 到开始的 seedsseedsseeds 中,完成 seedsseedsseeds 初始化。完成此过程的为 cv2.setMouseCallback()cv2.setMouseCallback()cv2.setMouseCallback()。
  • 以上面步骤得到的 seedsseedsseeds 进行区域生长,创建与原 CTCTCT 图大小相同的空白图 seedMarkseedMarkseedMark,根据初始化的种子点的坐标在 seedMarkseedMarkseedMark 标记为 255255255。在定义种子点的八领域坐标,当种子与其八邻域的像素差大于 666 且之前在 seedMarkseedMarkseedMark 没有被标记过时,则不合并,反之将其与种子进行合并,方式为令 seedMarkseedMarkseedMark 的对应坐标的像素为 255255255,并将其存入种子队列作为下次生长时的种子,将当前种子点从种子队列中去除。
  • 输入 qqq 回车结束交互,效果展示。

代码:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
from collections import deque# 计算种子点和其领域的像素值之差
def getGrayDiff(gray, current_seed, tmp_seed):return abs(int(gray[current_seed[0], current_seed[1]]) - int(gray[tmp_seed[0], tmp_seed[1]]))# 区域生长算法
def regional_growth(gray, seeds):#八领域connects = [(-1, -1), (0, -1), (1, -1), (1, 0), \(1, 1), (0, 1), (-1, 1), (-1, 0)]seedMark = np.zeros((gray.shape))height, width = gray.shapethreshold = 6seedque = deque()label = 255seedque.extend(seeds)while seedque :#队列具有先进先出的性质。所以要左删current_seed = seedque.popleft()seedMark[current_seed[0], current_seed[1]] = labelfor i in range(8) :tmpX = current_seed[0] + connects[i][0]tmpY = current_seed[1] + connects[i][1]#处理边界情况if tmpX < 0 or tmpY < 0 or tmpX >= height or tmpY >= width :continuegrayDiff = getGrayDiff(gray, current_seed, (tmpX, tmpY))if grayDiff < threshold and seedMark[tmpX, tmpY] != label :seedque.append((tmpX, tmpY))seedMark[tmpX, tmpY] = labelreturn seedMark#交互函数
def Event_Mouse(event, x, y, flags, param) :#左击鼠标if event == cv.EVENT_LBUTTONDOWN :#添加种子seeds.append((y, x))#画实心点cv.circle(img, center = (x, y), radius = 2,color = (0, 0, 255), thickness = -1)def Region_Grow(img):cv.namedWindow('img')cv.setMouseCallback('img', Event_Mouse)cv.imshow('img', img)while True :cv.imshow('img', img)if cv.waitKey(1) & 0xFF == ord('q') :breakcv.destroyAllWindows()CT = cv.imread('images/CT.png', 1)seedMark = np.uint8(regional_growth(cv.cvtColor(CT, cv.COLOR_BGR2GRAY), seeds))cv.imshow('seedMark', seedMark)cv.waitKey(0)plt.figure(figsize=(12, 4))plt.subplot(131), plt.imshow(cv.cvtColor(CT, cv.COLOR_BGR2RGB))plt.axis('off'), plt.title(f'$input\_image$')plt.subplot(132), plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))plt.axis('off'), plt.title(f'$seeds\_image$')plt.subplot(133), plt.imshow(seedMark, cmap='gray', vmin = 0, vmax = 255)plt.axis('off'), plt.title(f'$segmented\_image$')plt.tight_layout()plt.show()if __name__ == '__main__':img = cv.imread('./images/CT.png')seeds = []Region_Grow(img)

【Opencv】图像分割——区域生长相关推荐

  1. OpenCV图像分割Grabcut算法

    前言 1.OpenCV图像分割Grabcut算法主要功能是分割和抠图,就是把框着的目标抠出来,比如要分割出一个证件照的人的图像,只需要在目标外面画一个框,把目标框住,它就可以完成良好的分割. 2.算法 ...

  2. OpenCV图像分割实战视频教程-贾志刚-专题视频课程

    OpenCV图像分割实战视频教程-1739人已学习 课程介绍         基于OpenCV新版本3.2 讲述,详细解释了KMeans.高斯混合模型(GMM).分水岭变换.Grabcut等算法基本原 ...

  3. 视频教程-OpenCV图像分割实战视频教程-计算机视觉

    OpenCV图像分割实战视频教程 贾志刚 2004毕业于山东大学齐鲁软件学院,软件工程专业.专注于图像处理算法学习与研究,计算机视觉OpenCV开发应用,深度学习在计算机视觉领域应用.书籍<Ja ...

  4. Opencv图像分割小案例 --- 绿幕背景视频抠图

    基于HSV色彩空间的实时背景替换: 注:新更换的背景图必须和原视频的背景图尺寸一样.  相关API: 1. inRange()函数 opencv中的inRange()函数可实现二值化功能(这点类似th ...

  5. opencv图像分割 --- Grabcut图像分割

    Grabcut图像分割与GMM.KMeans.分水岭分割的区别在于, Grabcut图像分割是用户可以 选择目标图像,然后将剩余的作为背景,目标作为前景进行分割,这样可以把目标提取出来,也就 是抠图: ...

  6. opencv图像分割2-GMM

    GMM随机数分类: #include<opencv2\opencv.hpp> #include<iostream> using namespace cv; using name ...

  7. Opencv图像分割与Watershed算法

    文章目录 1 理论 2 测试图像 3 寻找硬币的近似估计 4 去除图像中的白色噪点 5 分水岭 1 理论   任何灰度图像都可以看作是一个地形表面,其中高强度表示山峰,低强度表示山谷.当用不同颜色的水 ...

  8. Matlab医学图像分割区域生长

    MATLAB医学图像分割 实验目的: 了解图像分割的基本理论和方法: 掌握阈值分割的方法和阈值的选择: 掌握基于分水岭分割的原理和应用: 实验内容: 区域生长法利用图像像素间的相似性进行分割,调用re ...

  9. opencv 图像分割 阈值分割 图像二值化 灰度图

    # -*- coding: utf-8 -*- """ @File : 191213_测试_阈值分割.py @Time : 2019/12/13 15:14 @Autho ...

  10. OpenCV图像分割-watershed

    转自:Tiger & Pi  http://blog.163.com/my_645/blog/static/369785222013310619742/ Watershed就是传说中的分水岭算 ...

最新文章

  1. 无法使用_解决kali linux 2020 安装完后发现无法使用 ifconfig
  2. oracle数据库从关闭到启动,Oracle数据库的启动和关闭详细过程
  3. 函数的方法call、apply、bind
  4. Bzoj3924 [Zjoi2015]幻想乡战略游戏
  5. JS 三级联动 下拉列表
  6. python sublime 提示补全_【原创】Sublime+Verilator建立强大的verilog编写环境
  7. 初学者的React全家桶完整实例
  8. 今年全国累计电影票房已破500亿 40亿以上票房仅3部
  9. jq的each方法之退出循环与继续循环
  10. 性能优化:要2个月才跑完的程序我是如何优化到到4小时的?
  11. 数据库可疑的解决方案
  12. Hadoop “Hello World” 示例
  13. o2o模式的优势 o2o模式的劣势
  14. imagemagick 压缩gif的正确姿势
  15. jmeter接口测试详细教程
  16. 使用WinImage的命令行修改img文件
  17. FlashFXP命令行
  18. 数据中心远程集中解决方案有哪些?
  19. Resultful接口实现后端文件下载
  20. 人工智能有哪些运用场景?有什么实际用途?

热门文章

  1. pe计算机找桌面文件,如何在Windows pe打开桌面文件夹?找不到原桌面文件夹怎么办?...
  2. tabLayout 设置分割线
  3. phpnow开启mysqli扩展
  4. 使用eleme upload组件上传附件时,文件后面的成功标志没有出来
  5. 全国python一级考试_全国青少年软件编程(Python)等级考试试卷(一级)测试卷...
  6. 手机对计算机的远程控制软件,教你用手机远程控制电脑,轻松实现远程操作!...
  7. (随笔)区块链是什么??
  8. pythonurllib新浪微博_利用python实现新浪微博爬虫_python新浪微博爬虫
  9. 码农造“神盘”:互联网人20年买房故事
  10. John Gaar “Slow Rollin” WA47 WA87 WA14麦克风