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

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.kler.cn/a/408138.html

相关文章:

  • 面向对象高级(7)注解
  • 使用itextpdf进行pdf模版填充中文文本时部分字不显示问题
  • 小R的二叉树探险 | 模拟
  • 从熟练Python到入门学习C++(record 6)
  • springboot3如何集成knife4j 4.x版本及如何进行API注解
  • GESP2023年9月认证C++四级( 第三部分编程题(1-2))
  • 在 Vue 项目中使用 betterScroll 的详细教程及原理解析
  • Spring 框架的介绍(Java EE 学习笔记02)
  • <OS 有关> ubuntu 24 安装 VMware Workstaion
  • 初阶数据结构之栈的实现
  • 【vue3+Typescript】unapp+stompsj模式下替代plus-websocket的封装模块
  • 百度Q3财报:净利润增长17%超预期 文心大模型日调用量增30倍达15亿
  • 通过轻易云平台实现聚水潭数据高效集成到MySQL的技术方案
  • stable diffusion生成模型
  • [Unity Demo]从零开始制作空洞骑士Hollow Knight第二十集:制作专门渲染HUD的相机HUD Camera和画布HUD Canvas
  • C0031.在Clion中使用mingw编译器来编译opencv的配置方法
  • 02. Python基础知识
  • js版本之ES5特性简述【String、Function、JSON、其他】(二)
  • MySQL系列之身份鉴别(安全)
  • Unet++改进35:添加FastKANConv2DLayer(2024最新改进方法)
  • 本地项目提交到gitee
  • 如何高效集成YS网店客户和组织映射数据到MongoDB
  • PHP导出EXCEL含合计行,设置单元格格式
  • Kafka 数据倾斜:原因、影响与解决方案
  • STM32-- 调试 -日志输出
  • vue3的宏到底是什么东西?