在一个广场上投射一个圆圈?

Bor*_*ris 5 python numpy scipy

我有一张存储为numpy阵列的视网膜照片.我用这个2D numpy数组代表这个图像(我的实际数组要大得多,有3个颜色通道,值是浮点数,不是全部0或者1):

array([[0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 0, 0, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 0, 0],
       [0, 1, 1, 1, 1, 1, 1, 1, 0],
       [0, 0, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 0, 0, 1, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0]])
Run Code Online (Sandbox Code Playgroud)

如何投影圆圈(以某种方式拉伸边缘?),使其成为正方形而不会被裁剪?所以它看起来像这样:

array([[0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 1, 1, 1, 1, 1, 1, 1, 0],
       [0, 1, 1, 1, 1, 1, 1, 1, 0],
       [0, 1, 1, 1, 1, 1, 1, 1, 0],
       [0, 1, 1, 1, 1, 1, 1, 1, 0],
       [0, 1, 1, 1, 1, 1, 1, 1, 0],
       [0, 1, 1, 1, 1, 1, 1, 1, 0],
       [0, 1, 1, 1, 1, 1, 1, 1, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0]])
Run Code Online (Sandbox Code Playgroud)

基本上,我正在寻找一个可以在此图像中执行保形映射的Python库

从圆到正方形的共形映射

Kas*_*mvd 1

您可以使用行和列中非零元素的最大和最小索引来获取 1 的范围,然后根据此范围填充数组索引:

>>> a=np.array([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
...        [ 0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.],
...        [ 0.,  0.,  1.,  1.,  1.,  1.,  1.,  0.,  0.],
...        [ 0.,  0.,  1.,  1.,  1.,  1.,  1.,  0.,  0.],
...        [ 0.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  0.],
...        [ 0.,  0.,  1.,  1.,  1.,  1.,  1.,  0.,  0.],
...        [ 0.,  0.,  1.,  1.,  1.,  1.,  1.,  0.,  0.],
...        [ 0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.],
...        [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]])
>>> 
>>> (min_row,max_row),(min_col,max_col)=map(lambda x :(np.min(x),np.max(x)),np.nonzero(a))
>>> a[min_row:max_row+1,min_col:max_col+1]=1
>>> a
array([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  0.],
       [ 0.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  0.],
       [ 0.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  0.],
       [ 0.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  0.],
       [ 0.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  0.],
       [ 0.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  0.],
       [ 0.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]])
Run Code Online (Sandbox Code Playgroud)