我的目标是跟踪其中包含许多单独形状的绘图,并将这些形状拆分为单独的图像。它是白底黑字。我对 numpy,opencv&co 很陌生 - 但这是我目前的想法:
- 扫描黑色像素
- 找到黑色像素 -> 分水岭
- 找到分水岭边界(作为多边形路径)
- 继续搜索,但忽略已找到边界内的点
我不太擅长这些事情,有没有更好的方法?
首先我试图找到分水岭结果的矩形边界框(这或多或少是一个例子的拼贴):
from numpy import *
import numpy as np
from scipy import ndimage
np.set_printoptions(threshold=np.nan)
a = np.zeros((512, 512)).astype(np.uint8) #unsigned integer type needed by watershed
y, x = np.ogrid[0:512, 0:512]
m1 = ((y-200)**2 + (x-100)**2 < 30**2)
m2 = ((y-350)**2 + (x-400)**2 < 20**2)
m3 = ((y-260)**2 + (x-200)**2 < 20**2)
a[m1+m2+m3]=1
markers = np.zeros_like(a).astype(int16)
markers[0, 0] = 1
markers[200, 100] = 2
markers[350, 400] = 3
markers[260, 200] = 4
res = ndimage.watershed_ift(a.astype(uint8), markers)
unique(res)
B = argwhere(res.astype(uint8))
(ystart, xstart), (ystop, xstop) = B.min(0), B.max(0) + 1
tr = a[ystart:ystop, xstart:xstop]
print tr
不知何故,当我使用原始数组 (a) 时,argwhere 似乎可以工作,但是在分水岭 (res) 之后它只是再次输出完整的数组。
下一步可能是找到形状周围的多边形路径,但边界框现在很棒!
请帮忙!