在图像处理中,方差和梯度之间有关系吗?

2024-05-19 07:07:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Python进行瑕疵消除的工作。为了参考如何实现瑕疵消除,我已经阅读了以下代码:Blemish Removal。去除瑕疵所需的步骤如下:

  1. 找到有瑕疵的坐标(即像素坐标)

  2. 获得坐标后,接下来找到梯度较低的相邻坐标。 这一步背后的想法是找到一个光滑的补丁,并适用于有瑕疵的地方,否则称为补丁

  3. 然后应用无缝克隆以应用修补程序

现在,下面的代码使用OpenCV中的Scharr操作符来计算渐变。接下来,它对x方向和y方向上的绝对梯度求和。这些总梯度是针对特定面片计算的

def calcVariance(patch):
    x = cv2.Scharr(patch, -1, 1, 0)
    y = cv2.Scharr(patch, -1, 0, 1)

    return np.abs(x) + np.abs(y)

从下面的代码中,查看variance = 1/calcVariance(patch).sum()行。我们将方差设置为梯度的倒数。我对这一行有点困惑。我们为什么要这样做?再说一遍,为什么要再次计算总和calcVariance(patch).sum()

def pickBestAround(xy, values, image):
    bestV = 0
    best_xy = None
    for move in np.array([(-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1)]) * 30:
        xy_m = xy + move
        if xy_m[xy_m<0].sum() < 0:
            continue
        patch = getPatch(xy_m, values)
        variance = 1/calcVariance(patch).sum()
        if variance > bestV:
            bestV = variance
            best_xy = xy_m

        return getPatch(best_xy, values), getPatch(best_xy, image)

我从代码推断,方差与计算的梯度成反比。这是真的吗


Tags: 代码np方向patchbest梯度valuessum

热门问题