如何编写代码自动测量二值图像中黑色区域的纵向像素长度?

自动测量黑色区域垂直长度的实现思路
核心步骤
图像预处理
- 读取图像后转为灰度图(若原图像为彩色),再通过二值化明确区分黑、白区域,确保黑色区域像素值统一(比如设为0或255,可根据实际图像调整阈值)。
- 若图像存在噪声,可通过腐蚀、膨胀等形态学操作去除小干扰点,避免影响边界检测精度。
定位黑色区域边界
- 提取所有黑色像素的坐标,从中筛选出最小行号(黑色区域的顶部)和最大行号(黑色区域的最低点)。
- 垂直长度计算公式为:最大行号 - 最小行号 + 1(包含首尾像素,符合像素计数逻辑)。
特殊情况处理
若图像存在多个黑色区域,可通过连通域分析(如OpenCV的cv2.connectedComponentsWithStats)筛选出面积最大的连通域,仅针对目标区域计算长度,避免误判。批量处理
遍历目标文件夹内的所有图像,循环执行上述步骤,将每个图像的测量结果保存至CSV或其他格式文件,实现自动化批量计算。
示例代码(Python + OpenCV)
import cv2 import numpy as np import os def calculate_black_length(img_path): # 读取灰度图像 img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) if img is None: return None # 二值化:将黑色区域转为255,白色转为0(根据实际图像调整阈值) _, binary = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV) # 获取所有黑色像素的坐标 black_coords = np.where(binary == 255) if len(black_coords[0]) == 0: return 0 # 计算顶部和底部行号 top_y = np.min(black_coords[0]) bottom_y = np.max(black_coords[0]) return bottom_y - top_y + 1 # 批量处理示例 input_dir = "./segmented_images" results = [] for filename in os.listdir(input_dir): if filename.endswith(('.png', '.jpg', '.jpeg')): path = os.path.join(input_dir, filename) length = calculate_black_length(path) results.append((filename, length)) # 保存结果到CSV with open("measurement_results.csv", "w") as f: f.write("filename,length_pixels\n") for item in results: f.write(f"{item[0]},{item[1]}\n")
内容的提问来源于stack exchange,提问作者abdullah
相关产品推荐
相关产品推荐

