基于距椭圆中心的距离计算重量

时间:2015-02-03 17:10:20

标签: 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
    distance[m] = 1.0 - distance[m]/radius
    array = np.zeros((r, c))
    array[m] = distance[m]
    return array

这基本上是将高度重量设置在中心,重量线性地向边缘下降。

现在,我想用椭圆做类似的事情。同样,椭圆沿着两个维度可以具有非常不同的半径,并且我希望重量也随着距离线性地下降。然而,无论长半径还是短半径,我都希望权重类似于边缘衰减。我猜我需要在半径的基础上加入一个权重来实现这个目标,但无法弄明白。

1 个答案:

答案 0 :(得分:1)

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

ellipse = lambda x0, y0, r_x, r_y: lambda x, y: ((x - x0) / r_x)**2 + ((y - y0) / r_y)**2

def gen_ellipse(el, lower, upper, step):
    coords = np.arange(lower, upper, step)
    x, y = np.meshgrid(coords, coords)
    mask = el(x, y)
    mask[np.where(mask > 1)] = 0
    return 1 - mask

例如:

> %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'))

elliptical mask

黑色为1,白色为0。