Python PIL&;NumPy数组--基于颜色(黑白)提取形状

Python PIL&;NumPy数组--基于颜色(黑白)提取形状,python,numpy,python-imaging-library,Python,Numpy,Python Imaging Library,我有一个黑白图像,其中背景仅包含黑色像素,而数字/字符均为白色(见附图) 图像来自PIL,然后转换为NumPy数组 我希望能够将每个字符/数字(最好是1px黑边框)提取到单独的NumPy数组/图像中 我对PIL和NumPy还很陌生,所以我现在唯一的想法就是手动迭代数组,验证每个像素的颜色,以获得坐标,从而在正确的位置剪切图像 还有其他(更简单/更高效)的解决方案吗?您只想要图像还是数字本身(作为整数) 如果您想分离白色数字,我建议您查看OpenCV及其 它可以检测您的手指的边缘,作为一个像素列

我有一个黑白图像,其中背景仅包含黑色像素,而数字/字符均为白色(见附图)

图像来自PIL,然后转换为NumPy数组

我希望能够将每个字符/数字(最好是1px黑边框)提取到单独的NumPy数组/图像中

我对PIL和NumPy还很陌生,所以我现在唯一的想法就是手动迭代数组,验证每个像素的颜色,以获得坐标,从而在正确的位置剪切图像


还有其他(更简单/更高效)的解决方案吗?

您只想要图像还是数字本身(作为整数)

如果您想分离白色数字,我建议您查看OpenCV及其

它可以检测您的手指的边缘,作为一个像素列表

这样做:

import cv2
import numpy as np

image = cv2.imread('image.png')


def consecutive(data):
    return np.split(data, np.where(np.diff(data) != 1)[0]+1)


spl = list(map(lambda x: x[-1], 
    consecutive(np.unique(np.argwhere(image.sum(axis=0) < 30)[:, 0]))))

splits = np.split(image, spl, axis=1)
导入cv2
将numpy作为np导入
image=cv2.imread('image.png')
def连续(数据):
返回np.split(数据,np.where(np.diff(数据)!=1)[0]+1)
spl=列表(映射(λx:x[-1],
连续(np.unique(np.argwhere(image.sum(axis=0)<30[:,0]))
拆分=np.拆分(图像,spl,轴=1)
例如:


也许您可以在图像的各个列上进行迭代,查看列中所有项目的黑色位置。你可以确保你只在一个有白色的列后面找到那些列,你想要的是图像的“连接组件”。您可以在scikit image和opencv中通过单个函数调用来实现这一点。此外,如果您希望在每个组件周围增加一个像素,只需首先放大图像(这意味着要扩展所有白色区域)。