Python 基于椭圆中心距离的权值计算

Python 基于椭圆中心距离的权值计算,python,image-processing,numpy,Python,Image Processing,Numpy,我之前使用的是圆形图像遮罩,我根据与圆心的距离计算权重,如下所示: import numpy as np def create_mask(image, radius, center=(0, 0)): r, c, d = image.shape x, y = np.ogrid[:r, :c] distance = np.sqrt((x-center[0])**2 + (y-center[1])**2) m = distance < radius dis

我之前使用的是圆形图像遮罩,我根据与圆心的距离计算权重,如下所示:

import numpy as np
def create_mask(image, radius, center=(0, 0)):
    r, c, d = image.shape
    x, y = np.ogrid[:r, :c]
    distance = np.sqrt((x-center[0])**2 + (y-center[1])**2)
    m = distance < radius
    distance[m] = 1.0 - distance[m]/radius
    array = np.zeros((r, c))
    array[m] = distance[m]
    return array
将numpy导入为np
def create_遮罩(图像、半径、中心=(0,0)):
r、 c,d=图像形状
x、 y=np.ogrid[:r,:c]
距离=np.sqrt((x-中心[0])**2+(y-中心[1])**2)
m=距离<半径
距离[m]=1.0-距离[m]/半径
数组=np.零((r,c))
数组[m]=距离[m]
返回数组
这基本上是将高度-重量设置在中心,重量向边缘线性下降


现在,我想做一些类似于椭圆的事情。同样,椭圆在两个维度上的半径可能非常不同,我希望重量也随着距离线性下降。然而,无论长半径还是短半径,我希望权重向边缘类似地衰减。我猜我需要包含一个基于两个半径的权重来实现这一点,但无法计算出来。

我不确定线性权重,但可以使用实现从1到0的连续数组权重(我相信有一种更有效的方法来实现这一点)

例如:

> %pylab
> el = ellipse(0.0, 0.0, 0.3, 0.8)
> mask = gen_ellipse(el, -1.0, 1.0, 0.0025)
> imshow(mask, cmap=get_cmap('Greys'))


其中黑色为1,白色为0。

谢谢您的回答。你能为我详细说明一件事吗?我使用Skipage draw函数对椭圆进行参数化,该函数采用x和y中心坐标以及沿二维的半径。你能帮我看看你代码中的等价性吗?@Luca我不确定我是否完全理解你的问题。我上面的椭圆函数(现在由farenorth更新)可以接受x和y偏移,但之前它只是以
(0,0)
为中心,并在椭圆的两个半径上进行参数化。为了清晰起见,我修改了变量的名称
(x0,y0)
指定椭圆的中心,并且
(r\u x,r\u y)
定义它的半径。@Luca我已经使
gen_ellipse
函数更加高效和惯用,在这个过程中,我发现我仓促的数学运算使椭圆在
y=x
上反射(我交换了x和y坐标)。想法是一样的,不过,它只是一个高椭圆而不是一个短椭圆,对应于
r\ux
。谢谢。我正在努力使之适应我的需要。明天我会更新我的进度。
> %pylab
> el = ellipse(0.0, 0.0, 0.3, 0.8)
> mask = gen_ellipse(el, -1.0, 1.0, 0.0025)
> imshow(mask, cmap=get_cmap('Greys'))