微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用卷积导出图像会在边缘产生错误的结果

如何解决使用卷积导出图像会在边缘产生错误的结果

我正在上一门图像处理的在线课程,其中所有问题集都在 MATLAB 中给出。不过,我试图用 Python 解决它们,当我尝试使用卷积和以下内核来计算图像导数时,会得到一些意外的结果:[0.5,-0.5]

鉴于行i,我想使用与g卷积来计算列的导数。

image[i,:] = [1,2,3,4]
g = [0.5,-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,0])。 之所以开始使用-1是因为在j = 0l = 1下,我实际上得到了[-1]元素,在 Python 中是第n个元素。

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

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

解决方法

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

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.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. 对它进行迭代,每次相加后都相乘

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。