图像分割 - 区域生长

news2024/11/22 11:52:07

目录

1. 介绍

2. 代码详解

3. 代码


1. 介绍

分割的目的是将图像分为多个区域

常用的分割方法基于两个属性:不同区域间的灰度不连续性质(Canny边缘检测等等)、相同区域灰度的相似特征(阈值处理、区域生长等等)

区域生长就是基于同一区域的灰度相似特性展开的,通过预先设定的生长准则,将像素种子生长到更大区域的过程。基本的方法是,对于一组预设的点(这里称为种子),通过和其周围邻域灰度值比较,满足相同特性的(灰度值差异较小)像素点添加到新的种子,进而增长区域

区域生长的步骤为:

1. 先定义一组种子

2. 找到每一个种子的八邻域,判断它们的灰度值是否相似,相似的区域也划为新的种子

3. 循环这个过程,直到种子全部遍历完

2. 代码详解

这里不同的地方在于传入的种子是一副图像

例如将原图进行二值化处理,然后找到这二值化的图像传入seeds里面,通过np.where(seeds > 0) 来找到具体的种子点,然后保存在seed_list里面。这里的种子列表应该是一组这样 [x,y] 的点

 

循环停止的条件是种子列表里面没有种子。

将每一个种子取出,然后将对应的位置作为区域分割的结果 dst[x,y] = 255 。

根据之前定义的connects 周围8个点的相对位置偏差,找到周围的 8邻域

 

如果 8邻域不在图像上的话,就跳过这次判断

如果在图像上的话,判断是否满足灰度值相似的条件,并且这里要判断这个区域是否已经处理过,要不然会进入死循环

想象一下,相邻的两个点AB,在A是种子的时候,B作为A的邻域满足相似性,所以B为储存到种子列表。判断B的时候,A作为B的邻域,也会被储存到种子列表。那么这里就会出现死循环

但是,如果A已经被处理过了,dst 对应的A点已经是区域生长的区域的话。那么A作为B邻域的时候,A就不会作为新的种子了

如果都满足的话,保存到种子列表里面

 

3. 代码

import cv2
import numpy as np


# 区域生长算法
def regional_growth(image, seeds, thresh=5):            # 这里的seeds是一副图像
    height, weight = image.shape[0], image.shape[1]     # 图像的 height和 width
    dst= np.zeros(image.shape, dtype=np.uint8)          # 处理的结果
    seed_list = []                                      # 种子列表

    x,y = np.where(seeds > 0)                           # 找到种子seeds里面的种子
    for i in range(len(x)):
        seed_list.append((x[i],y[i]))

    connects = [(-1, -1), (0, -1), (1, -1), (1, 0), (1, 1), (0, 1), (-1, 1), (-1, 0)]  # 8 邻域

    while len(seed_list) > 0:                           # 判断种子受否剩余

        point = seed_list.pop(0)                        # 取出第一个
        x, y = point[0],point[1]
        dst[x, y] = 255                                 # 将对应位置的点标记为 255

        for i in range(8):                              # 对种子周围的 8个点一次进行相似性判断
            connects_tmp = connects[i]                      # 8 邻域
            x_tmp= x+ connects_tmp[0]
            y_tmp= y+ connects_tmp[1]

            if (x_tmp < 0) or (y_tmp < 0) or (x_tmp >= height) or (y_tmp >= weight):  # 是否超出限定阈值
                continue

            gray_diff = np.abs(int(image[x, y]) - int(image[x_tmp, y_tmp]))     # 判断相似性

            if (gray_diff <= thresh) and (dst[x_tmp, y_tmp] == 0):              # 相似的话储存为新的种子
                dst[x_tmp,y_tmp] = 255
                seed_list.append((x_tmp,y_tmp))
    return dst


# 区域生长 主程序
img = cv2.imread("./img.tif", flags=0)

_, img_bin = cv2.threshold(img, 254, 255, cv2.THRESH_BINARY)  # 阈值处理产生种子区域
dst = regional_growth(img, img_bin)
cv2.imshow('img', np.hstack((img,dst)))

cv2.waitKey()
cv2.destroyAllWindows()

处理结果:

这里阈值产生的种子图像为:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/28657.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

牛客网语法篇练习基础语法(一)

1.输出"Hello Nowcoder!"。开始你的编程之旅吧。 print(Hello Nowcoder!) 2.KiKi学会了print在屏幕输出信息&#xff0c;他想输出一架小飞机。请帮他编写程序输出这架小飞机。 print( *5 ** *5) print( *5 ** *5) print(**12) print(**12) print( *4 * * *4) prin…

Arduino操作MPU6050模块

MPU6050是集成三轴陀螺仪&#xff0c;三轴加速度计&#xff0c;温度传感器于一体的模块。本文档基于Adafruit_MPU6050实现MPU6050模块基本操作。 Adafruit_MPU6050库&#xff1a; https://github.com/adafruit/Adafruit_MPU6050 Adafruit_MPU6050依赖以下库&#xff0c;需要在…

Java中的char、Character和CharSequence的区别

char 与 Character char是一种基本的数据类型&#xff0c;Character是char类型的包装类&#xff0c;即通过Character创建出来的是一种对象。 Character是char的包装类&#xff0c;就像Integer和int&#xff0c;以及Long和long一样。 包装类和基本类型可以自动转换&#xff…

安泰测试-同惠TH2827精密LCR数字电桥产品性能特点

同惠(Tonghui)TH2827A/TH2827B/TH2827C型 LCR数字电桥 产品简介&#xff1a; TH2827A/TH2827B/TH2827C是具有多种功能和更高测试频率的新型LCR数字电桥&#xff0c;体积小&#xff0c;紧凑便携&#xff0c;便于上架使用。本系列仪器基本精度为0.05%&#xff0c;测试频率最高1M…

GitLab仓库管理系统安装详细步骤

前言 本案例安装 gitlab、jenkins、并部署springboot应用程序&#xff0c;所以准备了3台服务器。 服务器1&#xff1a;安装gitlab服务器2&#xff1a;安装jdk、maven、git、jenkins 因为jenkins需要jdk、maven、git服务器3&#xff1a;安装jdk。 jenkins自动部署的springboot…

多目标优化生态调度结果的预测方法研究——基于新蝙蝠算法(Matlab代码实现)

&#x1f352;&#x1f352;&#x1f352;欢迎关注&#x1f308;&#x1f308;&#x1f308; &#x1f4dd;个人主页&#xff1a;我爱Matlab &#x1f44d;点赞➕评论➕收藏 养成习惯&#xff08;一键三连&#xff09;&#x1f33b;&#x1f33b;&#x1f33b; &#x1f34c;希…

【CNN】ZFNet——让卷积神经网络不再是一个黑盒模型。

前言 ZFNet在2013年 ILSVRC 图像分类竞赛获得冠军&#xff0c;错误率11.19% &#xff0c;比2012年的AlexNet降低了5%&#xff0c;ZFNet是由 Matthew D.Zeiler 和 Rob Fergus 在 AlexNet 基础上提出的大型卷积网络。ZFNet解释了为什么卷积神经网络可以在图像分类上表现的如此出…

[MySQL]事务ACID详解

专栏简介 :MySql数据库从入门到进阶. 题目来源:leetcode,牛客,剑指offer. 创作目标:记录学习MySql学习历程 希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长. 学历代表过去,能力代表现在,学习能力代表未来! 目录 1. 事务的概念 2. 事务的特性 3.事务控制语法…

【经验篇】Java使用ZMQ断线重连问题

简介 ZeroMQ是一个高性能的异步消息传递库&#xff0c;旨在用于分布式或者并发应用程序。它提供了一个消息队列&#xff0c;但与面向消息的中间件不同&#xff0c;ZeroMQ 系统可以在没有专用消息代理的情况下运行。 ZeroMQ 支持各种传输&#xff08;TCP、进程内、进程间、多播…

初步认识端口服务查询--netstat

转载连接&#xff1a;netstat详解 目录1、语法与参数概括2、输出释义2.1 以netstat -atnlp为例&#xff0c;解释输出结果中各列的含义2.2、以netstat -rn为例&#xff0c;解释输出结果中各列的含义3、实用命令4、项目中通过netstat查询某端口是否被占用netstat命令是一个监控TC…

Spring5源码3-BeanDefinition

1. BeanDefinition BeanDefinition在spring中贯穿始终&#xff0c;spring要根据BeanDefinition对象来实例化bean&#xff0c;只有把解析的标签&#xff0c;扫描的注解类封装成BeanDefinition对象&#xff0c;spring才能实例化bean beanDefinition主要实现类: ChildBeanDefini…

ADB安装及使用详解

一、ADB简介 1、什么是adb ADB 全称为 Android Debug Bridge&#xff0c;起到调试桥的作用&#xff0c;是一个客户端-服务器端程序。其中客户端是用来操作的电脑&#xff0c;服务端是 Android 设备。 ADB 也是 Android SDK 中的一个工具&#xff0c;可以直接操作管理 Androi…

K8s高可用集群搭建

K8s高可用集群搭建1 方案简介2 集群搭建2.1 安装要求2.2 准备环境2.3 master节点部署keepalived2.4 master节点部署haproxy2.5 所有节点安装docker/kubeadm/kubelet2.6 部署k8smaster012.7 安装集群网络2.8 k8smaster02加入节点2.9 k8snode01加入集群3 测试集群1 方案简介 用到…

Session-based Recommendation with Graph Neural Networks论文阅读笔记

1. Abstract &#xff08;1&#xff09;基于会话的推荐问题旨在基于匿名会话来预测用户的行为。 The problem of session-based recommendation aims to predict user actions based on anonymous sessions. &#xff08;2&#xff09; 以前的方法存在的不足&#xff1a;不足以…

day3-day4【代码随想录】长度最小的子数组

文章目录前言一、长度最小的子数组1、暴力求解&#xff1a;2、滑动窗口求解&#xff1a;二、最小覆盖子串&#xff08;乐扣76&#xff09;难难难难难三、水果成篮&#xff08;乐扣904&#xff09;四、最长重复子数组&#xff08;乐扣718&#xff09;前言 实现滑动窗口&#xf…

Android抓包工具——Fiddler

前言 &#x1f525;在平时和其他大佬交流时&#xff0c;总会出现这么些话&#xff0c;“抓个包看看就知道哪出问题了”&#xff0c;“抓流量啊&#xff0c;payload都在里面”&#xff0c;“这数据流怎么这么奇怪”。 &#x1f449;这里出现的名词&#xff0c;其实都是差不多的…

矩阵分析:特征值分解

矩阵分析&#xff1a;特征值分解前置知识空间变换伸缩旋转对称矩阵对称矩阵对角化正交矩阵向量的基基变换不同基下的向量变换逆矩阵不同基下的空间变换内积的几何意义特征值、特征向量特征值分解代码前置知识 空间变换 伸缩 一个矩阵其实就是一个线性变换&#xff0c;因为一个…

SpringCloud微服务(六)——Gateway路由网关

Gateway路由网关 Spring Cloud Spring Cloud Gateway统一访问接口的路由管理方式 作用 整合各个微服务功能&#xff0c;形成一套系统微服务网关实现日志统一纪录实现用户的操作跟踪统一用户权限认证路由转发、跨域设置、负载均衡、服务限流反向代理 微服务网关的概述 不同…

H2DCFDA | ROS 荧光探针检测法

H2DCFDA 工作液的配制1、储存液的配制&#xff1a;用 DMSO 配制 10 mM 的 H2DCFDA (2,000)&#xff0c;如用 1.03 mL DMSO 溶解 5 mg H2DCFDA。注&#xff1a;H2DCFDA 储存液建议分装后-20℃ 避光冻存&#xff0c;一个月。-80 半年。2、工作液的配制&#xff1a;用预热好的无血…

绘制文字(QFont字体)

QPainter绘制文字的话使用的函数为 QPainter::drawText() QPainter::drawText()有多种重载方式。 根据坐标直接绘画文字&#xff1a; void Widget::paintEvent(QPaintEvent *event)//绘图事件 {QPainter painter(this);painter.translate(100,100);//移动坐标painter.drawText(…