如何使用Python统计二进制数组中的相邻像素数量
方案实现
你可以通过Pillow读取图像,配合numpy做矩阵运算实现需求,以下分两种常见场景给出代码:
场景1:统计原图所有黑色像素总量
如果你的需求是统计整张图里全部黑色像素的数量,直接二值化后计数即可:
from PIL import Image import numpy as np # 读取图像并转为灰度模式 img = Image.open("你的图像文件路径").convert("L") # 二值化处理:像素值小于127判定为黑色,否则为白色 binary_arr = (np.array(img) < 127).astype(np.uint8) # 统计黑色像素(值为0)的数量 black_count = np.sum(binary_arr == 0) print(f"黑色像素总数量:{black_count}")
场景2:统计黑色区域的边缘像素(对应示意图绿色标注位置)
如果你的需求是统计黑色区域和白色区域的交界像素(也就是你用numpy.diff()尝试计算的目标),可以用邻域判断法避免重复计数:
from PIL import Image import numpy as np # 读取图像并二值化,0代表黑色,1代表白色 img = Image.open("你的图像文件路径").convert("L") binary_arr = (np.array(img) < 127).astype(np.uint8) # 生成四个方向的偏移矩阵,边缘补1(白色) pad_right = np.pad(binary_arr[:, 1:], ((0, 0), (0, 1)), constant_values=1) pad_left = np.pad(binary_arr[:, :-1], ((0, 0), (1, 0)), constant_values=1) pad_down = np.pad(binary_arr[1:, :], ((0, 1), (0, 0)), constant_values=1) pad_up = np.pad(binary_arr[:-1, :], ((1, 0), (0, 0)), constant_values=1) # 筛选满足条件的像素:本身是黑色,且上下左右至少有一个方向是白色 edge_pixels = (binary_arr == 0) & ((pad_right == 1) | (pad_left == 1) | (pad_down == 1) | (pad_up == 1)) edge_count = np.sum(edge_pixels) print(f"边缘黑色像素数量:{edge_count}")
该方案逐像素判断是否符合要求,每个符合条件的像素仅计数一次,完全避免了numpy.diff()带来的重复计数问题。
内容的提问来源于stack exchange,提问作者nuemlouno
相关产品推荐
相关产品推荐

