用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
相关产品推荐
相关产品推荐

