做暖暖视频网站大全/网络推广方案设计
Python实现多种图像分割方法:基于阈值分割和基于区域分割
图像分割是图像分析的第一步,是计算机视觉的基础,但也是图像处理中最困难的问题之一。经典的计算机视觉任务,如目标检测、图像识别等都和图像分割相关,图像分割的好不好直接决定目标检测识别的准确不准确。
本文首先介绍了基于阈值和区域增长的图像分割方法。
然后针对图片中的书本和窗户旁边的人进行实验,并结合同态滤波和形态学算法对识别效果进行了优化。
图像分割
分割是指根据灰度、彩色、空间纹理、几何形状等特征把图像划分成若干个互不相交的区域,使得这些特征在同一区域内表现出一致性或相似性,而在不同区域间表现出明显的不同。简单的说就是在一幅图像中,把目标从背景中分离出来。
图像分割实质上是图像处理到图像分析的关键步骤,图像分割的好坏直接决定了后期图像分析的精准性。因此我们需要根据图像的特征设计不同的图像分割方法。现有的图像分割方法主要分以下几类:基于阈值的分割方法、基于区域的分割方法、基于边缘的分割方法以及基于特定理论的分割方法等。
基于阈值的图像分割
基于阈值的分割方法,是指基于图像的灰度特征来计算一个或多个灰度阈值,并将图像中每个像素的灰度值与阈值作比较,最后将像素根据比较结果分到合适的类别中。因此,该方法最为关键的一步就是按照某个准则函数来求解最佳灰度阈值。之所以能对灰度图像采用阈值分割,是因为灰度图像中区域内部的像素一般具有灰度相似性,而在区域的边界上一般具有灰度不连续性。所以阈值法特别适用于目标和背景占据不同灰度级范围的图片。
常用的阈值分割方法有Ostu阈值分割,自适应阈值分割,最大熵阈值分割,迭代阈值分割等。
图像若只有目标和背景两大类,那么只需要选取一个阈值进行分割,此方法成为单阈值分割;但是如果图像中有多个目标需要提取,单一阈值的分割就会出现作物,在这种情况下就需要选取多个阈值将每个目标分隔开,这种分割方法称为多阈值分割。本文主要采用的是单阈值分割法。
阀值分割方法的优点是计算简单且效率高,但缺点是只考虑了像素点灰度值本身的特征,没有考虑空间特征,因此对噪声比较敏感,鲁棒性不高。
由于阈值分割方法的关键在于阈值的选择,因此如果能将智能遗传算法应用在阀值筛选上,选取最优分割图像的阀值,能够更进一步提升阈值图像分割方法的效果。
基于区域的图像分割
基于区域的分割方法是以直接寻找区域为基础的分割技术,有两种基本形式:一种是基于区域生长的方式,从单个像素出发,逐步合并以形成所需要的分割区域;另一种是基于区域分裂的方式,从全局出发,逐步切割至所需的分割区域。
本文采用的是基于区域增长的方法,区域生长是指从一组代表不同生长区域的种子像素开始,接下来将种子像素邻域里符合条件的像素合并到种子像素所代表的生长区域中,并将新添加的像素作为新的种子像素继续合并过程,直到找不到符合条件的新像素为止,该方法的关键是选择合适的初始种子像素以及合理的生长准则。基于区域增长的方法计算也相对简单,同时对于较均匀的连通目标有较好的分割效果,但也经常会出现欠生长或过生长的情况。
区域生长算法需要解决的三个问题:
(1)选择或确定一组能正确代表所需区域的种子像素;
(2)确定在生长过程中能将相邻像素包括进来的准则;
(3)指定让生长过程停止的条件或规则。
形态学算法
形态学算法一般是针对二值图像,进行边界提取,骨架提取,孔洞填充,角点提取,图像重建等。基本的算法:膨胀、腐蚀、开操作和闭操作。形态学算法可以保持图像基本的形状特征,并除去不相干的结构特征。因此可以引入形态学算法来改善图像分割的效果。
Python代码实现图像分割
导入包:
import cv2
from matplotlib import pyplot as plt
%matplotlib inline
读取原始图和灰度化:
def cv_show(name,img):cv2.namedWindow(name,0)cv2.resizeWindow(name,700,900)cv2.imshow(name,img)cv2.waitKey(0)cv2.destroyAllWindows()raw_person = cv2.imread('images/person.png')
cv_show('raw_person', raw_person)gray_person = cv2.imread('images/person.png', flags=cv2.IMREAD_GRAYSCALE)
cv_show('gray_person', gray_person)
cv2.imwrite('results/person/gray_person.jpg',gray_person)
绘制灰度图和灰度直方图:
import numpy as np
hist = np.histogram(gray_person, bins=np.arange(0, 256), normed=True)
fig, axes = plt.subplots(1, 2, figsize=(20, 10))
axes[0].imshow(gray_person, cmap=plt.cm.gray, interpolation='nearest')
axes[0].axis('off')
axes[1].plot(hist[1][:-1], hist[0], lw=2)
axes[1].set_title('histogram of gray values')
plt.show()
定义形态学算法函数:
def img_morph(img, size=5, method='open', element='rect'):'''img: binary imagesize: the size of square used to do morphological filteringmethod: open or close or erode or dilateelement: structure element, rect or circle or cross'''if element == 'rect':kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (size, size))elif element == 'circle':kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (size, size))elif element == 'cross':kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (size, size))if method == 'open':img = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)elif method == 'close':img = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)elif method == 'erode':img = cv2.morphologyEx(img, cv2.MORPH_ERODE, kernel)elif method == 'dilate':img = cv2.morphologyEx(img, cv2.MORPH_DILATE, kernel)return img
基于阈值的图像分割:
t0=170
segmented_gray_img2 = np.where(gray_person[...,:] < t0, 255, 0).astype(np.uint8)cv_show('segmented_gray_image',segmented_gray_img2)
形态学滤波:
open_person=img_morph(segmented_gray_img2,size=200,method='open')
cv_show('open_person', open_person)dilate_person=img_morph(open_person,size=10,method='dilate')
cv_show('dilate_person', dilate_person)close_person=img_morph(dilate_person,size=100,method='close')
cv_show('close_person', close_person)dilate_person1=img_morph(close_person,size=20,method='dilate')
cv_show('dilate_person1', dilate_person1)segmented_person=cv2.bitwise_and(raw_person,raw_person,mask=dilate_person1)
cv_show('segmented_person', segmented_person)
cv2.imwrite('results/person/segmented_threshold_person.jpg',segmented_person)
基于区域增长的图像分割:
def region_grow(img, seeds, threshold):'''select the bgd pixel attentionally to simplify the problemimg: gray scale imageseeds: the seed pixels'''seed_list = seedsneighbors = [[-1,-1],[-1,0],[-1,1],[0,-1],[0,1],[1,-1],[1,0],[1,1]]is_search = np.zeros(img.shape)is_add = np.zeros(img.shape)for seed in seeds:is_add[seed[0], seed[1]] = 1grow_img = np.ones(img.shape).astype(np.uint8)*255# mean_value = img[seed[0], seed[1]]cnt = 1while(len(seed_list)>0):cnt += 1seed = seed_list.pop()grow_img[seed[0], seed[1]] = 0is_search[seed[0], seed[1]] = 1for neighbor in neighbors:# print(neighbor, seed)neighbor_x = seed[0]+neighbor[0]neighbor_y = seed[1]+neighbor[1]if neighbor_x < 0 or neighbor_y < 0 or neighbor_x >= img.shape[0] or neighbor_y >= img.shape[1]:continueelif is_search[neighbor_x, neighbor_y] == 1 or is_add[neighbor_x, neighbor_y] == 1:continue# elif abs(img[neighbor_x, neighbor_y] - mean_value) > threshold:elif abs(float(img[neighbor_x, neighbor_y]) - float(img[seed[0],seed[1]])) > threshold:continueelse:seed_list.insert(0, [neighbor_x, neighbor_y])is_add[neighbor_x, neighbor_y] = 1# mean_value = mean_value/cnt+img[neighbor_x, neighbor_y]/cnt# print(mean_value)# grow_img[neighbor_x, neighbor_y] = 0return grow_imgseeds = [[341,942],[1510,960],[773,931],[2018,949]]
grow_person = region_grow(gray_person, seeds, 4)
grow_person = 255-grow_person
cv_show('grow_person',grow_person)open_grow_person=img_morph(grow_person,size=50,method='open')
cv_show('open_grow_person', open_grow_person)close_grow_person1=img_morph(open_grow_person,size=200,method='close')
cv_show('close_grow_person1', close_grow_person1)segmented_region_person = cv2.bitwise_and(raw_person,raw_person,mask= close_grow_person1)
cv_show('segmented_region_person',segmented_region_person)
cv2.imwrite('results/person/segmented_region_person.jpg',segmented_region_person)
更多详细代码发布在https://github.com/JeremyChou28/digital_image_processing/tree/main/project4
相关文章:

Python实现多种图像分割方法:基于阈值分割和基于区域分割
Python实现多种图像分割方法:基于阈值分割和基于区域分割 图像分割是图像分析的第一步,是计算机视觉的基础,但也是图像处理中最困难的问题之一。经典的计算机视觉任务,如目标检测、图像识别等都和图像分割相关,图像分…...

SQL学习笔记+MySQL+SQLyog工具教程
文章目录 1、前言2、SQL基本语言及其操作2.1、CREATE TABLE – 创建表2.2、DROP TABLE – 删除表2.3、INSERT – 插入数据2.4、SELECT – 查询数据2.5、SELECTDISTINCT – 去除重复值后查询数据2.6、SELECTWHERE – 条件过滤2.7、AND & OR – 运算符2.8、ORDER BY – 排序2…...

SpringBoot的日志管理
🙈作者简介:练习时长两年半的Java up主 🙉个人主页:程序员老茶 🙊 ps:点赞👍是免费的,却可以让写博客的作者开心好久好久😎 📚系列专栏:Java全栈,…...

leetcode---76. 最小覆盖子串 [C++/滑动窗口+哈希表]
原题:76. 最小覆盖子串 - 力扣(LeetCode) 题目解析: 此题在这道题的基础上进行理解会更简单 leetcode --- 30. 串联所有单词的子串[C 滑动窗口/双指针]-CSDN博客 本题要求在s字符串中找到含有t字符串所有字符的最短子串。 也就是…...

Kafka 分级存储在腾讯云的实践与演进
导语 腾讯云消息队列 Kafka 内核负责人鲁仕林为大家带来了《Kafka 分级存储在腾讯云的实践与演进》的精彩分享,从 Kafka 架构遇到的问题与挑战、Kafka 弹性架构方案类比、Kafka 分级存储架构及原理以及腾讯云的落地与实践四个方面详细分享了 Kafka 分级存储在腾讯云…...

域架构下的功能安全思考
来源:联合电子 随着整车电子电气架构的发展,功能域控架构向整车集中式区域控制演进。新的区域控制架构下,车身控制模块(BCM),整车控制单元(VCU),热管理系统(TMS)和动力底…...

python多线程介绍
每个库或模块都有其特定的用途和优势,选择哪一个取决于具体的任务需求、计算资源。一般可以将任务分成两类: I/O 密集型任务:这些任务的瓶颈主要在于等待外部操作,如磁盘读写或网络通信。在这些等待期间,CPU 大部分时间…...

征文榜单 | 腾讯云向量数据库获奖名单公布
为了帮助开发者更快、更便捷地构建应用程序,有效提高开发人员生产力,腾讯云推出了AI原生向量数据库。它能提供全托管的自研企业级分布式数据库服务,专用于存储、检索、分析多维向量数据,是国内首个从接入层、计算层、到存储层提供…...

如何预防[[MyFile@waifu.club]].wis [[backup@waifu.club]].wis勒索病毒感染您的计算机?
导言: 近期,一种新兴的威胁[[MyFilewaifu.club]].wis [[backupwaifu.club]].wis勒索病毒,引起了广泛关注。这种恶意软件通过其高度复杂的加密算法,威胁着用户和组织的数据安全。本文将深入介绍[[MyFilewaifu.club]].wis [[backup…...

中国风春节倒计时【实时倒计时】
<head><meta charset="UTF-8"><meta name="apple-mobile-web-app-title...

基于RBAC的k8s集群权限管控案例
在日常的kubernetes集群维护过程中,常常涉及多团队协作,不同的团队有不同的操作和权限需求。比如,运维团队需要有node的所有操作权限,以便对集群进行节点的扩缩容等日常维护工作,但资产运营团队通常只需要node的查看权…...

【华为数据之道学习笔记】5-11 算法模型设计
算法是指训练、学习模型的具体计算方法,也就是如何求解全局最优解,并使得这个过程高效且准确,其本质上是求数学问题的最优化解,即算法是利用样本数据生成模型的方法。算法模型是根据业务需求,运用数学方法对数据进行建…...

Flink系列之:SELECT WHERE clause
Flink系列之:SELECT & WHERE clause 一、SELECT & WHERE clause二、SELECT DISTINCT 适用于流、批 一、SELECT & WHERE clause SELECT 语句的一般语法是: SELECT select_list FROM table_expression [ WHERE boolean_expression ]table_e…...

C#基础——委托、Action和Func的使用
1、委托 委托(Delegate)是一种类型,可以用来表示对一个或多个方法的引用。委托提供了一种方便的方式来将方法作为参数传递给其他方法,或将方法存储在数据结构中以供以后调用。 不带参数且没返回值的委托 delegate void HDLDelega…...

不止业务缓存,分布式系统中还有哪些缓存?
缓存是分布式系统开发中的常见技术,在分布式系统中的缓存,不止 Redis、Memcached 等后端存储;在前端页面、浏览器、网络 CDN 中也都有缓存的身影。 缓存有哪些分类 如果你是做业务开发的话,提起缓存首先想到的应该是应用 Redis&…...

Java 基础学习(十三)集合框架、List集合
1 集合框架 1.1 Collection 1.1.1 集合框架概述 Java 集合框架是一组实现了常见数据结构(如列表、树集和哈希表等)的类和接口,用于存储一组数据。 开发者在使用Java的集合类时,不必考虑数据结构和算法的具体实现细节ÿ…...

el-select二次封装实现可分页加载数据
使用el-select时一次性渲染几百条数据时会造成页面克顿, 可以通过分页来实现, 这里我用的方式为默认获取全部数据, 然后一次性截取10条进行展示, 滚动条触底后会累加, 大家也可以优化为滚动条触底后发送请求去加载数据 创建自定义指令customizeFocus用户懒加载 在utils文件夹(…...

css实现0.5px宽度/高度显——属性: transform: scale
在大多数设备上,实际上无法直接使用 CSS 来精确地创建 0.5 像素的边框。因为大多数屏幕的最小渲染单位是一个物理像素,所以通常只能以整数像素单位渲染边框。但是,有一些技巧可以模拟出看起来像是 0.5 像素的边框。 这里介绍使用:…...

html懒人加载实现
在HTML中,懒加载(Lazy Load)是一种延迟加载图片或其他资源的技术,它可以提高页面的加载速度和性能。下面是一种实现懒加载的方法: 设置默认占位图片:在HTML中,为要延迟加载的图片设置一个默认的…...

Axure情形动作篇(ERP登录效验)
目录 一、ERP系统用户登录效验 1.1 完成步骤 1.2 最终效果 二、省市区联动 三、ERP菜单栏页面跳转 四、下拉加载效果实现 4.1 加载动画实现步骤 4.2 下划界面加载实现 4.3 最终效果 一、ERP系统用户登录效验 1.1 完成步骤 首先搭建ERP系统的登录界面(输入…...

LeetCode刷题--- 子集
个人主页:元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题【 http://t.csdnimg.cn/yUl2I 】【C】 【 http://t.csdnimg.cn/6AbpV 】数据结构与算法【 http://t.csdnimg.cn/hKh2l 】 前言:这个专栏主要讲…...

【SQL】根据年份,查询每个月的数据量
根据年份,查询每个月的数据量 一种 WITH Months AS (SELECT 1 AS Month UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION…...

基于CTF探讨Web漏洞的利用与防范
写在前面 Copyright © [2023] [Myon⁶]. All rights reserved. 基于自己之前在CTF中Web方向的学习,总结出与Web相关的漏洞利用方法,主要包括:密码爆破、文件上传、SQL注入、PHP伪协议、反序列化漏洞、命令执行漏洞、文件包含漏洞、Vim…...

Apache CouchDB 垂直权限绕过漏洞 CVE-2017-12635 已亲自复现
Apache CouchDB 垂直权限绕过漏洞 CVE-2017-12635 已亲自复现 漏洞名称影响版本影响版本 漏洞复现环境搭建漏洞利用 总结 漏洞名称 影响版本 Apache CouchDB是一个开源的NoSQL数据库,专注于易用性和成为“完全拥抱web的数据库”。它是一个使用JSON作为数据存储格式…...

海康威视IP网络对讲广播系统命令执行漏洞(CVE-2023-6895)
漏洞介绍 海康威视IP网络对讲广播系统采用领先的IPAudio™技术,将音频信号以数据包形式在局域网和广域网上进行传送,是一套纯数字传输系统。 Hikvision Intercom Broadcasting System 3.0.3_20201113_RELEASE(HIK)版本存在操作系统命令注入漏洞,该漏洞源于文件/ph…...

IDE:DevEco Studio
简介 DevEco Studio是华为为开发者提供的一款集成开发环境(IDE),主要用于开发鸿蒙操作系统(HarmonyOS)的应用程序。作为一款全场景分布式开发工具,DevEco Studio支持多端开发、调试和模拟,为开…...

【QT】C++/Qt使用Qt自带工具windeployqt打包
基本操作 运行项目debug或者release 将运行后的可执行文件单独放到一个文件夹中 根据项目使用的kits来选择Qt的打包工具 打开工具后移动到exe文件夹下执行windeployqt xxx.exe 预览图 问题 打包后再其他电脑上运行出现下图错误 将自己电脑的这个文件拷到可执行文件夹中既…...

Ubuntu系统的基础操作和使用
文章目录 系统安装系统界面文件系统包管理命令行常见问题 Ubuntu是一个基于Debian的Linux发行版,以桌面应用为主。它是自由软件,意味着你可以自由地使用、复制、研究、修改和改进这个软件。下面我们将详细介绍Ubuntu系统的基础操作和使用。 系统安装 U…...

harmonyOS 自定义组件基础演示讲解
上文 HarmonyOS组件属性控制 链式编程格式推荐我们讲了一些系统组件 可以传入一些事件和参数 来达到一些不同的效果 其实 我们还可以用自己写的组件 那么 组件这么写? 其实 我们的 page 内部结果 就是一个组件 harmonyOS的概念 万物皆组件 那么 我们就可以在他下面…...

我的创作纪念日——成为创作者第1024天
机缘 一、前言 早上收到CSDN的推送信息,今天是我成为创作者的第1024天,回想起自己已经好久没有写博客了,突然间很有感触,想水一篇文章,跟小伙伴们分享一下我的经历。 二、自我介绍 我出生在广东潮汕地区的一个小城…...