opencv-python 分离边缘粘连的物体(距离变换)

请添加图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

import cv2
import numpy as np

# 读取图像,这里添加了判断图像是否读取成功的逻辑
img = cv2.imread("./640.png")
# 灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 高斯模糊
gray = cv2.GaussianBlur(gray, (5, 5), 0)
# 二值化
ret, binary = cv2.threshold(gray, 115, 255, cv2.THRESH_BINARY)
kernel = np.ones((5, 5), np.uint8)
# 开运算
binary = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel, iterations=1)

cv2.imshow('thres', binary)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 距离变换
dist = cv2.distanceTransform(binary, cv2.DIST_L2, 3)
# 对二值图像进行距离变换操作,使用cv2.distanceTransform函数,计算图像中每个非零像素到最近的零像素的距离,
# 参数cv2.DIST_L2表示使用欧几里得距离(也可以选择其他距离度量方式),参数3表示距离变换的掩码大小,
# 得到的dist结果是一个单通道图像,其像素值表示对应的距离信息,该操作常用于图像分割等场景中,帮助区分不同区域的边界等。

dist_out = cv2.normalize(dist, 0, 1.0, cv2.NORM_MINMAX)
# 对距离变换得到的图像进行归一化处理,使用cv2.normalize函数,将像素值归一化到0到1.0的范围,
# 方便后续基于归一化后的距离值进行阈值处理等操作,采用cv2.NORM_MINMAX归一化类型,表示将最小值映射到0,最大值映射到1.0。

cv2.imshow('distance-Transform', dist_out*100)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 显示归一化后的距离变换图像,为了更直观地查看距离信息,将归一化后的图像像素值乘以100进行放大显示(只是为了视觉效果更好,

ret, surface = cv2.threshold(dist_out, (0.35 * dist_out.max()), 255, cv2.THRESH_BINARY)
# 对归一化后的距离变换图像进行阈值处理,确定图像中的前景区域,这里使用cv2.threshold函数,
# 注意阈值参数的计算,先通过(0.35 * dist_out.max())计算出具体的阈值数值(原代码此处计算方式有误,需先算出具体值再传入函数),
# 大于该阈值的像素设置为255(白色),表示属于前景区域,小于等于该阈值的像素设置为0(黑色),处理后的图像surface表示初步确定的前景区域。

print(surface)
cv2.imshow('123', surface)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 乘回来、转格式、
img_1 = (surface*255).astype(np.uint8)
# 轮廓查询
# print(cv2.RETR_LIST, cv2.RETR_EXTERNAL, cv2.RETR_CCOMP, cv2.RETR_TREE)
contours, hierarchy = cv2.findContours(img_1, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

for cnt in contours:
    # 精准绘制轮廓
    cv2.drawContours(img, [cnt], -1, (0, 255, 0), 1)
    cv2.imshow('1', img)
cv2.waitKey(0)

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

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

相关文章

YOLO-FaceV2: A Scale and Occlusion Aware Face Detector

《YOLO-FaceV2:一种尺度与遮挡感知的人脸检测器》 1.引言2.相关工作3.YOLO-FaceV23.1网络结构3.2尺度感知RFE模型3.3遮挡感知排斥损失3.4遮挡感知注意力网络3.5样本加权函数3.6Anchor设计策略3.7 归一化高斯Wasserstein距离 4.实验4.1 数据集4.2 训练4.3 消融实验4.3.1 SEAM块4…

CMake笔记:install(TARGETS target,...)无法安装的Debug/lib下

1. 问题描述 按如下CMake代码,无法将lib文件安装到Debug/lib或Release/lib目录下,始终安装在CMAKE_INSTALL_PREFIX/lib下。 install(TARGETS targetCONFIGURATIONS DebugLIBRARY DESTINATION Debug/lib) install(TARGETS targetCONFIGURATIONS Release…

网络编程 day1.2~day2——TCP和UDP的通信基础(TCP)

笔记脑图 作业&#xff1a; 1、将虚拟机调整到桥接模式联网。 2、TCP客户端服务器实现一遍。 服务器 #include <stdio.h> #include <string.h> #include <myhead.h> #define IP "192.168.60.44" #define PORT 6666 #define BACKLOG 20 int mai…

[Flux.jl] 非线性回归的拟合

调用第三方库 using Flux, Random using Plots设置随机种子以确保结果的可重复性 Random.seed!(1)生成数据集 x_data rand(Float32, 500) *20 .- 10 # 生成100个随机x值&#xff0c;范围在0到20之间 y_data sin.(x_data) ./ x_data # 生成y值 y_data reshape(y_data, …

如何创建一个项目用于研究element-plus的原理

需求&#xff1a;直接使用element-plus未封装成组件的源码&#xff0c;创建一个项目&#xff0c;可以使用任意的element-plus组件&#xff0c;可以深度研究组件的运行。例如研究某一个效果&#xff0c;如果直接在node_modules修改elment-plus打包之后的那些js、mjs代码&#xf…

借助算力云跑模型

算力平台&#xff1a;FunHPC | 算力简单易用 AI乐趣丛生 该文章只讲述了最基本的使用步骤&#xff08;因为我也不熟练&#xff09;。 【注】&#xff1a;进入平台&#xff0c;注册登录账号后&#xff0c;才能租用。学生认证&#xff0b;实名认证会有免费的算力资源&#xff0…

C语言:函数指针精讲

1、函数指针 一个函数总是占用一段连续的内存区域&#xff0c;函数名在表达式中有事也会被转换为该函数所在内存区域的首地址&#xff0c;这和数组名非常类似&#xff0c;我们可以把函数这个首地址&#xff08;或称入口地址&#xff09;赋予一个指针变量&#xff0c;使指针变量…

CPU命名那些事

一、Intel CPU命名 1. 命名结构 Intel CPU 的命名通常包含以下几个部分&#xff1a; 品牌 产品线 系列 代数 具体型号 后缀 例如&#xff1a;Intel Core i7-13700K 2. 各部分含义 品牌 Intel&#xff1a;表示厂商&#xff08;几乎所有命名中都有&#xff09;。不同品…

几个bev模型部署常用的命令

python tools/create_data.py nuscenes --root-path ./data/nuscenes --out-dir ./data/nuscenes --extra-tag nuscenes --version v1.0-mini ##迷你版数据集 python tools/create_data.py nuscenes --root-path ./data/nuscenes --out-dir ./data/nuscenes --extra-tag nuscen…

Vue3-小兔鲜项目出现问题及其解决方法(未写完)

基础操作 &#xff08;1&#xff09;使用create-vue搭建Vue3项目 要保证node -v 版本在16以上 &#xff08;2&#xff09;添加pinia到vue项目 npm init vuelatest npm i pinia //导入creatPiniaimport {createPinia} from pinia//执行方法得到实例const pinia createPinia()…

Halo 正式开源: 使用可穿戴设备进行开源健康追踪

在飞速发展的可穿戴技术领域&#xff0c;我们正处于一个十字路口——市场上充斥着各式时尚、功能丰富的设备&#xff0c;声称能够彻底改变我们对健康和健身的方式。 然而&#xff0c;在这些光鲜的外观和营销宣传背后&#xff0c;隐藏着一个令人担忧的现实&#xff1a;大多数这些…

鸿蒙NEXT开发案例:随机数生成

【引言】 本项目是一个简单的随机数生成器应用&#xff0c;用户可以通过设置随机数的范围和个数&#xff0c;并选择是否允许生成重复的随机数&#xff0c;来生成所需的随机数列表。生成的结果可以通过点击“复制”按钮复制到剪贴板。 【环境准备】 • 操作系统&#xff1a;W…

Linux 下的IO模型

一&#xff1a;四种IO模 1.1&#xff1a;阻塞式IO&#xff08;最简单&#xff0c;最常用&#xff0c;效率最低&#xff09; 阻塞I/O 模式是最普遍使用的I/O 模式&#xff0c;大部分程序使用的都是阻塞模式的I/O 。 缺省情况下&#xff08;及系统默认状态&#xff09;&#xf…

深度可观察性:它是什么,为什么我们需要它?

随着混合云基础设施成为现代企业的支柱&#xff0c;威胁形势的发展速度比以往任何时候都快。 越来越老练的攻击者、隐藏的漏洞和复杂的监管要求使 IT 和安全团队更难确保在这个复杂的环境中提供强大的保护。 2024 年 Gigamon 混合云安全调查显示&#xff0c;安全和 IT 领导者…

【附代码原理】偏正态分布的数据处理方法

文章目录 相关教程基本信息数学定义参数的影响Python 实现安装 scipy生成和绘制偏正态分布的数据 解释应用 右偏&#xff08;即长尾在右侧&#xff09;的正态分布1. 对数变换 (Log Transformation)2. 平方根变换 (Square Root Transformation)3. Box-Cox 变换注意事项 左偏&…

【STM32】MPU6050简介

文章目录 MPU6050简介MPU6050关键块带有16位ADC和信号调理的三轴MEMS陀螺仪具有16位ADC和信号调理的三轴MEMS加速度计I2C串行通信接口 MPU6050对应的数据手册&#xff1a;MPU6050 陀螺仪加速度计 链接: https://pan.baidu.com/s/13nwEhGvsfxx0euR2hMHsyw?pwdv2i6 提取码: v2i6…

一篇快速上手 Axios,一个基于 Promise 的网络请求库(涉及原理实现)

Axios 1. 介绍1.1 什么是 Axios&#xff1f;1.2 axios 和 ajax 的区别 2. 安装使用3. Axios 基本使用3.1 Axios 发送请求3.2 其他方式发送请求3.3 响应结构3.4 Request Config3.5 默认配置3.6 创建实例对象发送请求 3.7 拦截器3.8 取消请求 4. 模拟 Axios4.1 axios 对象创建过程…

趋势洞察|AI 能否带动裸金属 K8s 强势崛起?

随着容器技术的不断成熟&#xff0c;不少企业在开展私有化容器平台建设时&#xff0c;首要考虑的问题就是容器的部署环境——是采用虚拟机还是物理机运行容器&#xff1f;在往期“虚拟化 vs. 裸金属*”系列文章中&#xff0c;我们分别对比了容器部署在虚拟化平台和物理机上的架…

Unity-添加世界坐标系辅助线

如果你想在场景中更直观地显示世界坐标系&#xff0c;可以通过编写一个简单的脚本来实现。下面是一个基本的示例脚本&#xff0c;它会在场景中绘制出世界坐标系的三个轴&#xff1a; using UnityEngine;public class WorldAxesIndicator : MonoBehaviour {public float length…

决策树分类算法【sklearn/决策树分裂指标/鸢尾花分类实战】

决策树分类算法 1. 什么是决策树&#xff1f;2. DecisionTreeClassifier的使用&#xff08;sklearn&#xff09;2.1 算例介绍2.2 构建决策树并实现可视化 3. 决策树分裂指标3.1 信息熵&#xff08;ID3&#xff09;3.2 信息增益3.3 基尼指数&#xff08;CART&#xff09; 4. 代码…