当前位置: 首页 > news >正文

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)
http://www.lryc.cn/news/488066.html

相关文章:

  • 机器学习杂笔记1:类型-数据集-效果评估-sklearn-机器学习算法分类
  • Django+Nginx+uwsgi网站使用Channels+redis+daphne实现简单的多人在线聊天及消息存储功能
  • 数据结构在二叉树Oj中利用子问题思路来解决问题
  • 华为openEuler考试真题演练(附答案)
  • 生成自签名证书并配置 HTTPS 使用自签名证书
  • 物联网核心安全系列——智能汽车安全防护的重要性
  • 数据库视图
  • 从传统分析到智能问数,打造零门槛数据分析方案
  • java 设计模式 模板方法模式
  • 基于UDP和TCP实现回显服务器
  • 在 CentOS 系统上直接安装 MongoDB 4.0.25
  • Android和IOS的区别
  • 数据库基础(MySQL)
  • Vue前端开发子组件向父组件传参
  • javaScript语法基础(函数,对象,常用类Array,String,Math和Date)
  • WebStorm 2022.3.2/IntelliJ IDEA 2024.3出现elementUI提示未知 HTML 标记、组件引用爆红等问题处理
  • k8s-NetworkPolicy
  • 【C++】踏上C++学习之旅(九):深入“类和对象“世界,掌握编程的黄金法则(四)(包含四大默认成员函数的练习以及const对象)
  • C++——智能指针剖析
  • 241119.LeetCode——383.赎金信
  • 基于SSM的农家乐管理系统+论文示例参考
  • 用 Python 从零开始创建神经网络(九):反向传播(Backpropagation)(还在更新中。。。)
  • Flink是如何实现 End-To-End Exactly-once的?
  • 【vulhub】nginx解析漏洞(nginx_parsing_vulnerability)
  • 网络协议之邮件协议(SMTP、POP3与IMAP)
  • python学习笔记(3)运算符
  • _FYAW智能显示控制仪表的简单使用_串口通信
  • 激光雷达定位初始化的另外一个方案 通过键盘按键移动当前位姿 (附python代码)
  • 从0-1逐步搭建一个前端脚手架工具并发布到npm
  • 河道水位流量一体化自动监测系统:航运安全的护航使者