我想计算该图像的最小垂直距离和最大水平距离。
就像线条一样。
我正在尝试:
_, 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)
说明:
- 加载图像并转换为二进制图像: 与的代码相同,这将加载图像并使用阈值将其转换为二进制图像。
-
查找形状轮廓:
这将使用
cv2.findContours()
函数查找图像中所有形状的轮廓。 -
获取最大的轮廓:
我们假设只有一个形状,因此我们使用
max()
函数和cv2.contourArea
作为键来查找最大的轮廓。 - 计算最小垂直距离: 我们遍历轮廓中的所有点对,并计算它们之间的垂直距离。然后,我们跟踪找到的最小距离。
- 计算最大水平距离: 我们遍历轮廓中的所有点,并计算它们与图像左侧的水平距离。然后,我们跟踪找到的最大距离。
- 打印结果: 最后,我们打印计算出的最小垂直距离和最大水平距离。
这段代码应该可以更准确地计算形状的最小垂直距离和最大水平距离。
标签:python,numpy,opencv From: 78773866