首页 > 解决方案 > 使用卷积来导出图像边缘上的错误结果

问题描述

我正在学习图像处理的在线课程,其中所有问题集都在MATLAB中给出。尽管如此,我试图用Python解决它们,当我尝试使用卷积计算图像导数时,我得到了一些意想不到的结果:[0.5,0, -0.5].

给定行i,我想使用卷积计算列导数g

image[i,:] = [1,2,3,4]
g = [0.5,0,-0.5]

我使用以下代码对两者进行卷积:

    inImage_i_conv = np.zeros_like(inImage_i)

    for j in range(0,len(inImage_i)-1):
        conv = []
        for m in range(len(dy)):
            l = m-1
            conv.append(inImage_i[j-l]*dy[l+1])
        inImage_i_conv[j] = np.sum(conv)

结果是array([-1, 1, 1, 0])-1开头的原因是在j = 0and下l = 1,我实际上得到了[-1]元素,在Python中是第nth 元素。

我应该在第 th 行(或图像最左列的列)0之前添加 a 吗?我应该在左边添加第一个元素的副本吗?i0

常见的做法是什么?因为我的结果显然是错误的。

标签: pythonconvolutionderivative

解决方案


因此,如果您想自己纠正卷积,这里是一个好的开始。

import numpy as np

def zero_pad(X, pad):
    X_pad = np.pad(X, pad, 'constant', constant_values=0)
    return X_pad

def conv_step(x, W):
        return np.sum(np.multiply(x, W))

def conv(s, k):
    diff = abs(len(s) - len(k) - 1)
    slide = len(k)
    # flip kernel
    k = k [::-1]
    Z = np.zeros(shape=len(s)-diff)
    for i in range(Z.shape[0]):
        Z[i] = conv_step(s[i:i+slide], k)
    return Z

s = [1,2,3,4]
g = [0.5,0,-0.5]
print(np.convolve(s, g, 'same'))  # [ 1.   1.   1.  -1.5]
print(conv(zero_pad(s,1),g))  # [ 1.   1.   1.  -1.5]

您可以看到它返回的结果与内置函数相同np.convolve。它遵循卷积的基本步骤,您可以在https://en.wikipedia.org/wiki/Convolution中看到这些步骤

  1. 将向量填充到所需的长度
  2. 翻转内核(或输入)
  3. 创建所需长度的填充向量
  4. 迭代它,每次乘法都跟着求和

推荐阅读