scipy 把一个圆投影到一个正方形上?

ltskdhd1  于 2023-08-05  发布在  其他
关注(0)|答案(2)|浏览(170)

我有一个存储为numpy数组的photograph of a retina。我将用这个2D numpy数组来表示这个图像(我的实际数组要大得多,有3个颜色通道,值是浮点数,而不是所有的01):

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]])

字符串
我如何投影圆(以某种方式拉伸边缘?),以便它成为一个正方形而不被裁剪?所以它看起来像这样:

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]])


基本上,我正在寻找一个Python库,它可以做这个图像中的保角Map


的数据

bqucvtff

bqucvtff1#

为此使用squircle(免责声明:我写的)

import squircle
import PIL
import numpy as np

square = np.asarray(Image.open('some-square-image.jpg'))  # or create the array some other way

circle = squircle.to_circle(square, method="fgs")
and_back_to_square = squircle.to_square(circle, method="fgs")

字符串
有3种不同的方法来转换圆/正方形:"fgs""stretch""elliptical"
它不处理椭圆和矩形,但你可以通过对图像进行上采样来做到这一点,天真地将其压缩成一个正方形,在其上运行squircle并将其重新压缩成一个矩形。
您可以使用

pip install squircle

cld4siwp

cld4siwp2#

您可以使用行和列中非零元素的最大和最小索引来获取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.]])

字符串

相关问题