首页 > 解决方案 > 图像处理中的方差和梯度之间有什么关系吗?

问题描述

我正在用 Python 去除瑕疵。有关如何实现去除瑕疵的参考,我浏览了以下代码:去除瑕疵。去除瑕疵所需的步骤是:

  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)

我从代码中推断出方差与计算的梯度成反比。真的吗?

标签: pythonopencvimage-processing

解决方案


推荐阅读