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

黑白像素簇检测:获取白点坐标并计算距图像底部距离

解决方案:高效提取黑白图像白点坐标并计算底部距离

核心思路

你的需求不需要复杂的聚类——如果白点是独立的白点/白块,用OpenCV或PIL的原生图像处理工具就能高效完成,比逐像素遍历快得多,完全能应对千万像素级图像的批量处理。

具体步骤

1. 图像预处理(可选)

如果图像存在噪点,先通过二值化+形态学操作过滤杂点,避免误识别:

import cv2
import numpy as np

# 读取图像并转为灰度图
img = cv2.imread('your_image.png', cv2.IMREAD_GRAYSCALE)
# 二值化(根据实际白点亮度调整阈值,这里假设白点亮度≥200)
_, binary_img = cv2.threshold(img, 200, 255, cv2.THRESH_BINARY)
# 开运算去除小噪点
kernel = np.ones((3,3), np.uint8)
cleaned_img = cv2.morphologyEx(binary_img, cv2.MORPH_OPEN, kernel)

2. 提取白点/白块的中心坐标

用OpenCV的轮廓检测功能,直接提取所有白色区域的轮廓,再计算每个轮廓的质心(即你需要的中点):

# 查找所有外部白色轮廓
contours, _ = cv2.findContours(cleaned_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 存储每个白点的中心坐标
centers = []
for cnt in contours:
    # 计算轮廓的矩
    M = cv2.moments(cnt)
    if M["m00"] != 0:  # 避免除以0的异常
        cX = int(M["m10"] / M["m00"])
        cY = int(M["m01"] / M["m00"])
        centers.append((cX, cY))

这个方法基于C++底层实现的OpenCV接口,算力消耗极低,处理千万像素级图像毫无压力,远快于Python层面的逐像素遍历。

3. 计算到图像底部的距离

注意OpenCV中图像的y轴向下为正,图像底部的y坐标等于图像的高度,直接计算每个中心到该值的差值即可:

img_height = img.shape[0]
distances = [img_height - y for (x, y) in centers]

得到的distances就是所有白点中心到图像底部的距离列表,可直接用于不同图像的数值对比。

关于聚类方案的说明

只有当白点是密集团状(比如一堆白点需合并为一个目标)时,聚类才有意义。如果是独立的白点/白块,轮廓检测已经足够高效,额外加聚类反而会增加不必要的算力消耗。

批量处理优化

处理数百张图像时,可通过多进程并行处理提升效率:

from multiprocessing import Pool

def process_image(img_path):
    # 封装单张图像的处理逻辑
    img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
    _, binary_img = cv2.threshold(img, 200, 255, cv2.THRESH_BINARY)
    kernel = np.ones((3,3), np.uint8)
    cleaned_img = cv2.morphologyEx(binary_img, cv2.MORPH_OPEN, kernel)
    contours, _ = cv2.findContours(cleaned_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    centers = []
    for cnt in contours:
        M = cv2.moments(cnt)
        if M["m00"] != 0:
            cX = int(M["m10"] / M["m00"])
            cY = int(M["m01"] / M["m00"])
            centers.append((cX, cY))
    img_height = img.shape[0]
    distances = [img_height - y for (x, y) in centers]
    return img_path, distances

# 批量处理所有图像
image_paths = ['img1.png', 'img2.png', ...]
with Pool(processes=4) as pool:  # 进程数根据CPU核心数调整
    results = pool.map(process_image, image_paths)

# 输出或保存结果
for img_path, distances in results:
    print(f"{img_path}: {distances}")

内容的提问来源于stack exchange,提问作者olivia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 03:35:25