【Opencv】图像分割——区域生长
文章目录
- 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】图像分割——区域生长相关推荐
- OpenCV图像分割Grabcut算法
前言 1.OpenCV图像分割Grabcut算法主要功能是分割和抠图,就是把框着的目标抠出来,比如要分割出一个证件照的人的图像,只需要在目标外面画一个框,把目标框住,它就可以完成良好的分割. 2.算法 ...
- OpenCV图像分割实战视频教程-贾志刚-专题视频课程
OpenCV图像分割实战视频教程-1739人已学习 课程介绍 基于OpenCV新版本3.2 讲述,详细解释了KMeans.高斯混合模型(GMM).分水岭变换.Grabcut等算法基本原 ...
- 视频教程-OpenCV图像分割实战视频教程-计算机视觉
OpenCV图像分割实战视频教程 贾志刚 2004毕业于山东大学齐鲁软件学院,软件工程专业.专注于图像处理算法学习与研究,计算机视觉OpenCV开发应用,深度学习在计算机视觉领域应用.书籍<Ja ...
- Opencv图像分割小案例 --- 绿幕背景视频抠图
基于HSV色彩空间的实时背景替换: 注:新更换的背景图必须和原视频的背景图尺寸一样. 相关API: 1. inRange()函数 opencv中的inRange()函数可实现二值化功能(这点类似th ...
- opencv图像分割 --- Grabcut图像分割
Grabcut图像分割与GMM.KMeans.分水岭分割的区别在于, Grabcut图像分割是用户可以 选择目标图像,然后将剩余的作为背景,目标作为前景进行分割,这样可以把目标提取出来,也就 是抠图: ...
- opencv图像分割2-GMM
GMM随机数分类: #include<opencv2\opencv.hpp> #include<iostream> using namespace cv; using name ...
- Opencv图像分割与Watershed算法
文章目录 1 理论 2 测试图像 3 寻找硬币的近似估计 4 去除图像中的白色噪点 5 分水岭 1 理论 任何灰度图像都可以看作是一个地形表面,其中高强度表示山峰,低强度表示山谷.当用不同颜色的水 ...
- Matlab医学图像分割区域生长
MATLAB医学图像分割 实验目的: 了解图像分割的基本理论和方法: 掌握阈值分割的方法和阈值的选择: 掌握基于分水岭分割的原理和应用: 实验内容: 区域生长法利用图像像素间的相似性进行分割,调用re ...
- opencv 图像分割 阈值分割 图像二值化 灰度图
# -*- coding: utf-8 -*- """ @File : 191213_测试_阈值分割.py @Time : 2019/12/13 15:14 @Autho ...
- OpenCV图像分割-watershed
转自:Tiger & Pi http://blog.163.com/my_645/blog/static/369785222013310619742/ Watershed就是传说中的分水岭算 ...
最新文章
- 无法使用_解决kali linux 2020 安装完后发现无法使用 ifconfig
- oracle数据库从关闭到启动,Oracle数据库的启动和关闭详细过程
- 函数的方法call、apply、bind
- Bzoj3924 [Zjoi2015]幻想乡战略游戏
- JS 三级联动 下拉列表
- python sublime 提示补全_【原创】Sublime+Verilator建立强大的verilog编写环境
- 初学者的React全家桶完整实例
- 今年全国累计电影票房已破500亿 40亿以上票房仅3部
- jq的each方法之退出循环与继续循环
- 性能优化:要2个月才跑完的程序我是如何优化到到4小时的?
- 数据库可疑的解决方案
- Hadoop “Hello World” 示例
- o2o模式的优势 o2o模式的劣势
- imagemagick 压缩gif的正确姿势
- jmeter接口测试详细教程
- 使用WinImage的命令行修改img文件
- FlashFXP命令行
- 数据中心远程集中解决方案有哪些?
- Resultful接口实现后端文件下载
- 人工智能有哪些运用场景?有什么实际用途?
热门文章
- pe计算机找桌面文件,如何在Windows pe打开桌面文件夹?找不到原桌面文件夹怎么办?...
- tabLayout 设置分割线
- phpnow开启mysqli扩展
- 使用eleme upload组件上传附件时,文件后面的成功标志没有出来
- 全国python一级考试_全国青少年软件编程(Python)等级考试试卷(一级)测试卷...
- 手机对计算机的远程控制软件,教你用手机远程控制电脑,轻松实现远程操作!...
- (随笔)区块链是什么??
- pythonurllib新浪微博_利用python实现新浪微博爬虫_python新浪微博爬虫
- 码农造“神盘”:互联网人20年买房故事
- John Gaar “Slow Rollin” WA47 WA87 WA14麦克风