You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

用Python计算图像最小垂直距离与最大水平距离结果不准确的问题

问题分析与解决方案

原代码错误原因

你当前的代码逻辑完全误解了“垂直距离”的计算方式:

  • np.sum(binary_image==255, axis=0)统计的是每列的白色像素总数,取最小值得到的是白色像素最少的列的像素数,这和实际需要的“垂直距离”(无论是相邻白色区域的垂直间隔,还是白色区域自身的垂直高度)完全无关,所以结果必然不准确。

修正方案

根据常见的“最小垂直距离”需求(相邻白色区域的垂直间隔最小值),以下是修正后的代码:

import cv2
import numpy as np

# 读取图像并自动二值化(建议用OTSU自动阈值,避免手动阈值误差)
image = cv2.imread('你的图像路径.png', 0)
_, binary_image = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

# 计算最大水平距离:每行白色像素的最大数量(若白色区域连续,即为该行的白色宽度)
horizontal_row_sums = np.sum(binary_image == 255, axis=1)
max_horizontal_distance = np.max(horizontal_row_sums)

# 计算最小垂直距离(相邻白色区域的垂直间隔最小值)
# 1. 获取所有包含白色像素的行索引
white_rows = np.where(horizontal_row_sums > 0)[0]

min_vertical_distance = 0
if len(white_rows) > 0:
    # 找到连续行块的分割点(行索引差值大于1的位置)
    split_points = np.where(np.diff(white_rows) > 1)[0] + 1
    # 分割为多个连续白色行块
    row_blocks = np.split(white_rows, split_points)
    
    # 仅当存在多个白色块时计算间隔
    if len(row_blocks) > 1:
        vertical_gaps = []
        for i in range(len(row_blocks)-1):
            # 计算当前块结束行与下一块起始行的间隔
            gap = row_blocks[i+1][0] - row_blocks[i][-1] - 1
            vertical_gaps.append(gap)
        min_vertical_distance = np.min(vertical_gaps)

print(f"最大水平距离: {max_horizontal_distance}")
print(f"最小垂直距离: {min_vertical_distance}")

若需求为白色区域自身的最小垂直高度

如果你的“最小垂直距离”指的是单个白色区域的最小垂直高度(即占据的行数),只需替换垂直距离的计算部分:

# 计算白色区域的最小垂直高度
block_heights = [block[-1] - block[0] + 1 for block in row_blocks]
min_vertical_height = np.min(block_heights)

额外提示

  • 使用cv2.THRESH_OTSU自动阈值可以避免手动设置阈值导致的二值化偏差,这也是影响结果准确性的常见因素。
  • 如果图像存在噪声,建议在二值化前先使用cv2.medianBlur()或cv2.GaussianBlur()进行降噪处理。

内容的提问来源于stack exchange,提问作者david-oruna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 14:05:15