python-opencv图像分割

文章目录

    • 二值化
    • 图像骨骼
    • 连通域分割

二值化

所谓图像分割,就是将图像的目标和背景分离开来,更直观一点,就是把目标涂成白色,背景涂成黑色,言尽于此,是不是恍然大悟:这不就是二值化么?

【threshold]是此前提到的二值化函数,但只讲解了固定阈值分割模式,而并未讲解其自动分割的OTSU模式。

【adaptiveThreshold】是opencv提供的自适应阈值函数,可根据不同的卷积核来对局部进行二值化,可以更加细致地得到物体边缘。

OTSU算法,mean核,高斯核的分割结果如下图所示,其中150是手动设置的分割阈值;100是OTSU自动计算出的分割阈值。

提示说图像违规,也不知道哪违规了。

代码如下

import numpy as np
import matplotlib.pyplot as plt
from scipy.misc import ascent
import cv2

path = 'coins.jpg'

coins = {}
coins["original"] = plt.imread(path)
coins["gray"] = cv2.cvtColor(coins["original"],cv2.COLOR_RGB2GRAY)

_, coins['th150'] = cv2.threshold(coins["gray"], 150, 255, 
    cv2.THRESH_BINARY)
th, bImg = cv2.threshold(coins["gray"], 0, 255,
    cv2.THRESH_BINARY+cv2.THRESH_OTSU)
coins[f'otsu({th})'] = bImg


method = {"mean":cv2.ADAPTIVE_THRESH_MEAN_C,
          "gaussian":cv2.ADAPTIVE_THRESH_GAUSSIAN_C}
for key in method:
    coins[key] = cv2.adaptiveThreshold(coins["gray"], 255,
        method[key], cv2.THRESH_BINARY, 11, 2)

for i,key in enumerate(coins,1):
    plt.subplot(2,3,i)
    plt.imshow(coins[key], cmap='gray')
    plt.title(key)
    plt.axis('off')

plt.show()

图像骨骼

如果把二值图像理解成地形,黑色表示海洋,白色表示陆地,那么陆地上任意一点,到海洋都有一个最近的距离,如下图所示。由于硬币图案的颜色并不完全一致,所以在二值化时可能会出现不一致的情况,为此,需要通过腐蚀或者膨胀等形态学处理,将其内部涂抹均匀,从而得到一张目标与背景完全分割的图像,此即【dilate】图。对dilate图而言,【dist-bg】为其黑色区域的骨骼;【dist-fg】为白色区域的骨骼。

在这里插入图片描述

实现代码如下

import numpy as np
import matplotlib.pyplot as plt
from scipy.misc import ascent
import cv2

bImg = coins[f'otsu({th})']

kernel = np.ones((5,5),np.uint8)
coins["dilate"] = cv2.dilate(coins[f'otsu({th})'], kernel)
coins["dist-fg"] = cv2.distanceTransform(
    coins["dilate"], cv2.DIST_L2,5)
coins["dist-bg"] = cv2.distanceTransform(
    255-coins["dilate"], cv2.DIST_L2,5)

keys = ['dilate', 'dist-bg', 'dist-fg']
for i,key in enumerate(keys,1):
    plt.subplot(1,3,i)
    plt.imshow(coins[key], cmap='gray')
    plt.title(key)
    plt.axis('off')

plt.show()

【distanceTransform】函数的功能是,计算当前像素点到零像素点的最短距离,其输入参数有三,分别是输入的二值图像;求解距离的类型,以及掩膜尺寸,一般可设为3或者5。

在一张图像中,两点之间的距离有多种计算方式,比如

  • a a a 水平和数竖直方向的变化量
  • b b b 对角方向的变化量
  • c c c 条约移动的变化量

距离变换函数综合了这三种距离,根据各种距离的权重不同,提供了下面几种不同的距离类别

distanceTypemaskSize参数
CV_DIST_C3 ( 3 × 3 ) (3\times3) (3×3) a = 1 , b = 1 a=1, b=1 a=1,b=1
CV_DIST_L13 ( 3 × 3 ) (3\times3) (3×3) a = 1 , b = 2 a=1, b=2 a=1,b=2
CV_DIST_L23 ( 3 × 3 ) (3\times3) (3×3) a = 0.955 , b = 1.3693 a=0.955, b=1.3693 a=0.955,b=1.3693
CV_DIST_L25 ( 5 × 5 ) (5\times5) (5×5) a = 1 , b = 1.4 , c = 2.1969 a=1, b=1.4, c=2.1969 a=1,b=1.4,c=2.1969

连通域分割

所谓连通域,即Connected Component,是一组彼此相连的像素点的集合,这些像素点彼此之间可以假设一条互相链接的路径,路径上所有像素的灰度一致,或者符合某个特定的条件。

通过连通域分割,可以将图像中不同的目标区分开来,为进一步的处理打下基础,最常用的连通域滤波流程大致如下:图像灰度化->二值化->形态学处理->标记连通域,其前面的几个步骤已经在二值化以及距离变换中得以体现,其生成标签的结果如下图所示

在这里插入图片描述

其中,dilate是膨胀二值图。对其进行连通域分割,得到labels图像,其中每一枚硬币所在区域,都被分配到了一个编号,即Label,最后的三维图,便是这张图像的标签值。

处理和绘图代码如下

ret, coins["labels"] = cv2.connectedComponents(coins["dilate"])

for i,key in enumerate(['dilate', 'labels'],1):
    plt.subplot(1,3,i)
    plt.imshow(coins[key], cmap='gray')
    plt.title(key)
    plt.axis('off')

ax = plt.subplot(133, projection='3d')
ys, xs = np.indices(coins['labels'].shape)
ax.plot_surface(xs, ys, coins['labels'])
plt.title("labels")
plt.show()

【connectedComponents】是opencv提供的连通域分割函数,其必不可少的输入参数是一个二值图像,此外还有两个整型参数,分别用于规定邻域形式和输出的Labels类型。其中,邻域形式主要分为4-邻域和8邻域,前者把当前像素的上下左右四个像素算作邻域,换言之,这四个像素与当前像素是连通的;8-邻域则将一个像素周围的8个像素视作邻域。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux进程替换 自主shell程序

本篇将要讲解有关进程中最后一个知识点——进程替换,其中主要介绍有关进程替换的六个函数,直接从函数层面来理解进程替换(在使用函数的过程中,也会对进行替换进行解释)。本篇主要围绕如下的进程替换函数: 以…

【全开源】考试答题系统源码(FastAdmin+ThinkPHP+Uniapp)

一款基于FastAdminThinkPHPUniapp开发的小程序答题考试系统,提供全部前后台无加密源代码,支持私有化部署。 📝考试答题系统:便捷高效的学习新选择💡 📚 考试答题系统是什么? 考试答题系统&…

windows下visual studio 2019 c++代码混淆

环境:windows,visual studio 2019,cmake 目的:c代码混淆 一 IDE安装clang平台工具集 1:打开visual studio Installer 2.点击已安装下的 修改 ->单个组件,搜索框中输入"clang",勾选,然后点击安装。&…

SSM框架整合,内嵌Tomcat。基于注解的方式集成

介绍: SSM相信大家都不陌生,在spring boot出现之前,SSM一直是Java在web开发中的老大哥。现在虽说有了spring boot能自动整合第三方框架了,但是现在市面上任然有很多老项目是基于SSM技术的。因此,能熟练掌握SSM进行开发…

图与矢量 RAG — 基准测试、优化手段和财务分析示例

图与矢量 RAG — 基准测试、优化手段和财务分析示例 Neo4j 和 WhyHow.AI 团队探索了图和矢量搜索系统如何协同工作以改进检索增强生成 (RAG) 系统。使用财务报告 RAG 示例,我们探索了图和矢量搜索之间的响应差异,对两种类型的答案…

C# 反射类Assembly 程序集(Assembly)用法

常见的两种程序集: 可执行文件(.exe文件)和 类库文件(.dll文件)。 在VS开发环境中,一个解决方案可以包含多个项目,而每个项目就是一个程序集。 他们之间是一种从属关系,也就是说&…

算法第五天之力扣第27题:移除元素

一、移除元素 该题的题目链接如下所示,看题解前先点击或复制下面链接进入力扣做题哦,做题后看会更好哦。 https://leetcode.cn/problems/remove-element/description/https://leetcode.cn/problems/remove-element/description/ 给你一个数组 nums 和一…

【工具】批量SKU生成器

一个用户加我,要我帮忙写一个生成SKU的工具,他希望可以自定义生成的选项,可以批量生成。我到网上找了好久也没有找到好用的,就花了一下午写了这个生成sku的功能 工具支持批量生成SKU,支持自定义配置项,支持…

03_Windows11_PyTorch_GPU版本安装

1. 创建虚拟环境 1.1 查看所有的虚拟环境 使用超级管理员,打开 Anaconda Prompt conda info --envs conda env list 1.2 创建 PyTorch 虚拟环境 使用 nvidia-smi 命令,查看本机 CUDA 版本 打开pytorch官网 PyTorch ,查看相应版本pytorch即依赖关系 创建虚拟环境 conda…

自定义类型:枚举和联合体

在之前我们已经深入学习了自定义类型中的结构体类型 ,了解了结构体当中的内存对齐,位段等知识,接下来在本篇中将继续学习剩下的两个自定义类型:枚举类型与联合体类型,一起加油!! 1.枚举类型 …

模拟实现priority_queue

文章目录 priority_queue简介priority_queue的实现Myless和Mygreaterpushpop常规接口 全部代码测试代码 总结 priority_queue简介 priority_queue是优先级队列。 什么是优先级队列? 优先级队列(Priority Queue)是一种数据结构,用于…

【动手学深度学习】使用块的网络(VGG)的研究详情

目录 🌊1. 研究目的 🌊2. 研究准备 🌊3. 研究内容 🌍3.1 多层感知机模型选择、欠拟合和过拟合 🌍3.2 练习 🌊4. 研究体会 🌊1. 研究目的 理解块的网络结构;比较块的网络与传统…

Linux基础 (十四):socket网络编程

我们用户是处在应用层的,根据不同的场景和业务需求,传输层就要为我们应用层提供不同的传输协议,常见的就是TCP协议和UDP协议,二者各自有不同的特点,网络中的数据的传输其实就是两个进程间的通信,两个进程在…

activiti用法随记

案例&#xff1a; 摘抄于官网&#xff0c;假设我们有如下流程&#xff1a; 流程对应的bpmn文件如下&#xff1a; <definitions xmlns:activiti"http://activiti.org/bpmn" xmlns:bpmndi"http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc&quo…

configuration_auto.py in getitem raise KeyError(key) KeyError: ‘llama‘解决方案

运行LLaMA-7b模型有时候会报错“configuration_auto.py in getitem raise KeyError(key) KeyError:llama”如下所示&#xff1a; 解决办法升级安装transformer库即可&#xff0c;如下所示&#xff1a; pip install transformers4.30.0

vue3设置全局变量并获取 全局响应式变量 窗口大小

设置 js文件统一管理全局变量 方法1 app provide() 全局提供变量 通过inject()使用 方法2 app实例配置全局变量 获取 通过 getCurrentInstance.appContext.config.globalProperties.$innerWidth访问到 code import { ref } from vue export const useGlobalState () > {c…

新型AI编程语言Mojo来了!比Python快68000倍! 坚持每天写代码,真的能提高编程水平吗?

2024 年 3 月 29 日&#xff0c;Modular Inc. 宣布开源 Mojo 的核心组件。 Mojo语言是一种新的编程语言&#xff0c;由 Chris Lattner&#xff08;LLVM 和 Swift 语言的创始人&#xff09;创建的 Modular AI 公司开发。 它结合了Python的易用性和C的性能&#xff0c;旨在为人…

二说springboot3的自动配置机制

大家好&#xff0c;这里是教授.F 目录 SpringBootApplication&#xff1a; EableAutoConfiguration&#xff1a; 上一篇文章粗略的讲了自动配置机制&#xff0c;二说系列将从源码的角度进行讲解。 SpringBootApplication&#xff1a; 首先我们还是得从SpringBootApplication…

电商APP用户体验提升技巧:一个实战案例

随着网络和移动技术的快速发展&#xff0c;加上全球疫情的影响&#xff0c;电子商务应用程序改变了人们的购物方式&#xff0c;积累了大量的用户群体。如今&#xff0c;一个成功的电子商务应用程序&#xff0c;除了网站用户界面的美&#xff0c;电子商务用户体验的设计&#xf…

图片格式怎么转成pdf,简单的方法

在现代数字化时代&#xff0c;图片格式转换成PDF已经成为许多人的日常需求。无论是为了存档、分享还是打印&#xff0c;将图片转换为PDF都是一项非常实用的技能。本文将详细介绍如何将图片格式转换成PDF的方法。 用浏览器打开 "轻云处理pdf官网&#xff0c;上传图片。 图…