首页 > 编程问答 >用python计算形状的距离

用python计算形状的距离

时间:2024-07-21 11:18:34浏览次数:12  
标签:python numpy opencv

我想计算该图像的最小垂直距离和最大水平距离。

enter image description here

就像线条一样。

我正在尝试:

_, binary_image = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY)

horizontal_distances = np.sum(binary_image==255, axis=1)
max_horizontal_distance = np.max(horizontal_distances)

vertical_distances = np.sum(binary_image==255, axis=0)
min_vertical_distance = np.min(vertical_distances)

但是 min_vertical_distance 返回 11,这是不准确的。


以下是使用 OpenCV 和 Python 计算图像中形状的最小垂直距离和最大水平距离的更准确方法:

import cv2
import numpy as np

# 加载图像
image = cv2.imread('shape.png', cv2.IMREAD_GRAYSCALE)
_, binary_image = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY_INV)

# 查找形状轮廓
contours, _ = cv2.findContours(binary_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 获取最大的轮廓(假设只有一个形状)
largest_contour = max(contours, key=cv2.contourArea)

# 计算最小垂直距离
min_vertical_distance = float('inf')
for i in range(len(largest_contour) - 1):
    point1 = largest_contour[i][0]
    point2 = largest_contour[i + 1][0]
    distance = abs(point2[1] - point1[1])
    min_vertical_distance = min(min_vertical_distance, distance)

# 计算最大水平距离
max_horizontal_distance = 0
for point in largest_contour:
    distance = point[0][0]
    max_horizontal_distance = max(max_horizontal_distance, distance)

# 打印结果
print("最小垂直距离:", min_vertical_distance)
print("最大水平距离:", max_horizontal_distance)

说明:

  1. 加载图像并转换为二进制图像: 与的代码相同,这将加载图像并使用阈值将其转换为二进制图像。
  2. 查找形状轮廓: 这将使用 cv2.findContours() 函数查找图像中所有形状的轮廓。
  3. 获取最大的轮廓: 我们假设只有一个形状,因此我们使用 max() 函数和 cv2.contourArea 作为键来查找最大的轮廓。
  4. 计算最小垂直距离: 我们遍历轮廓中的所有点对,并计算它们之间的垂直距离。然后,我们跟踪找到的最小距离。
  5. 计算最大水平距离: 我们遍历轮廓中的所有点,并计算它们与图像左侧的水平距离。然后,我们跟踪找到的最大距离。
  6. 打印结果: 最后,我们打印计算出的最小垂直距离和最大水平距离。

这段代码应该可以更准确地计算形状的最小垂直距离和最大水平距离。

标签:python,numpy,opencv
From: 78773866

相关文章

  • 在感知器学习模型的 Python 实现中将数组传递给 numpy.dot()
    我正在尝试将单层感知器分类器的Python实现放在一起。我发现SebastianRaschka的《Python机器学习》一书中的示例非常有用,但我对他的实现的一小部分有疑问。这是代码:importnumpyasnpclassPerceptron(object):"""Perceptronclassifier.Parameters......
  • 带时间戳的 Python 命令行历史记录
    有没有办法记录每个命令的时间?例如,挂钩交互式shell,以便它将相同的内容写入~/.python_history到~/.python_history_timestamps但带有时间戳?我正在跟踪我白天所做的事情并将其放入我的日历中。为了帮助回溯,我使用了firefox历史记录、Dropbox活动、一个......
  • 在 python3 中迭代字典键时无法删除它:“RuntimeError:字典在迭代期间更改了大小”
    我试图在迭代字典时从字典中删除一个键。从字典中删除键时,我得到:RuntimeError:dictionarychangedsizeduringiteration我的代码:mydict={'one':1,'two':2,'three':3,'four':4}fork,vinmydict.items():ifk=='two'......
  • Python pyTelegramBotAPI:设置不受循环影响的变量
    我想创建一个基本上是布尔值的变量(无论机器人是否工作)。但是,当使用TeleBot.polling()时,脚本开始无限循环,所以如果我在代码开头设置一个变量就像:is_bot_working=True,变量将始终为真,反之亦然。那么,我应该如何设置一个不受循环影响的变量?这就是代码:impor......
  • 编解码器无法解码位置 2-3 中的字节:截断的 \UXXXXXXXX 转义 (Python QREADER)
    我正在尝试pythonqreader模块,但每次我尝试运行它时,我都会收到SyntaxError:(unicodeerror)'unicodeescape'codeccan'tDecodebytesinposition2-3:truncated\UXXXXXXXXescapeerror.fromqreaderimportQReaderfromcv2importQRCodeDetector,imreadfrompyz......
  • Python 工程师对 3D 高斯溅射的介绍(第 1 部分)
    从Python工程师的角度理解和编写GaussianSplatting欢迎来到雲闪世界。2023年初,来自法国蔚蓝海岸大学和马克斯普朗克信息研究所的作者发表了一篇题为“用于实时场渲染的3D高斯溅射”的论文。¹该论文展示了实时神经渲染的重大进步,超越了NeRF等先前方法的实用性。²......
  • 使用Python读取PDF文件,部分内容显示为一串乱码。我应该如何恢复它?
    使用Python读取PDF文件,部分内容显示为一串乱码。我该如何恢复它?importfitzdoc=fitz.open("2303.11366v4.pdf")#downloadfromhttps://arxiv.org/pdf/2303.11366print(doc[2].get_text().split('Figure1')[0])我得到了这样的文字:<RXDUHLQWKHPLGGOHRIDURRP>@7DVN......
  • Python 迭代列表
    分配sum_extra给定列表test_grades收到的额外学分总额。满分是100分,所以超过100分都是额外分。对于给定程序,sum_extra是8,因为1+0+7+0是8。给定程序的示例输出:额外总和:8请原谅我,我是编码新手,而且真的很糟糕!这是我的代码(不起作用)请......
  • 计算机毕业设计Python+Spark新能源汽车推荐系统 汽车大数据 汽车数据分析 汽车可视化
    表2黄河交通学院本科毕业设计(论文)开题报告学生姓名刘丹杰专业班级20本大数据一班学号2080910T01521设计(论文)题目基于Hadoop的新能源汽车销售数据分析系统的设计与实现选题的目的和意义:选题目的:新能源汽车销售数据分析系统的设计与实现旨在利用Hadoop等大数......
  • 为什么我的 python 程序一直说没有名为“PIL”的模块?
    我正在pythonIDLEshell中工作,由于某种原因pyautogui.locateOnScreen将无法工作。这是我的代码:frompyautoguiimport*importpyscreezeimportpyautoguiimporttimeimportkeyboardimportrandomimportwin32api,win32conwhile1:ifpyautogui.locateOnS......