Python 把一个圆投射到一个正方形上?
我有一个存储为numpy数组的。我将用这个2D numpy数组来表示这个图像(我的实际数组要大得多,有3个颜色通道,并且值是浮动的,不是所有的Python 把一个圆投射到一个正方形上?,python,numpy,scipy,Python,Numpy,Scipy,我有一个存储为numpy数组的。我将用这个2D numpy数组来表示这个图像(我的实际数组要大得多,有3个颜色通道,并且值是浮动的,不是所有的0或1): 如何投影圆(以某种方式拉伸边?),使其成为正方形而不被裁剪?所以它看起来像这样: 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
0
或1
):
如何投影圆(以某种方式拉伸边?),使其成为正方形而不被裁剪?所以它看起来像这样:
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库,它可以在这张图中进行保角映射
您可以使用行和列中非零元素的最大和最小索引来获取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.]])
用于此(免责声明:我写的)
变换圆/正方形有三种不同的方法:“fgs”
、“拉伸”
和“椭圆”
它不处理椭圆和矩形,但您可以通过对图像进行上采样,将其天真地挤压成正方形,在其上运行squircle,然后将其反挤压回矩形来实现这一点
您可以使用安装
pip install squircle
在math.stackexchange上可能会有所帮助。您可能需要进行一些舍入。请查看
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")
pip install squircle