gpt4 book ai didi

python - 证明卷积在平移方面是等变的

转载 作者:太空宇宙 更新时间:2023-11-04 04:49:54 25 4
gpt4 key购买 nike

我正在阅读深度学习书籍中有关卷积如何与翻译等价的以下陈述。

Let g be a function mapping one image function to another image function, such that I'=g(I) is the image function with I'(x, y) =I(x−1, y). This shifts every pixel ofIone unit to the right. If we apply this transformation to I, then apply convolution, the result will be the same as if we applied convolution to I', then applied the transformation g to the output.

对于我加粗的最后一行,他们正在对 I' 应用卷积,但这不应该是 I 吗? I' 是翻译后的图像。否则它实际上会说:

f(g(I)) = g( f(g(I)) )

f 是卷积,g 是平移。我正在尝试使用 3D 内核在 python 中自己执行相同的操作,该内核等于图像的深度,就像彩色图像(房子)的卷积层中的情况一样。

Input colored image

这是我对图像应用平移然后卷积的代码。

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
import scipy
import scipy.ndimage

I = scipy.ndimage.imread('pics/house.jpg')

def convolution(A, B):
return np.sum( np.multiply(A, B) )

k = np.array([[[0,1,-1],[1,-1,0],[0,0,0]], [[-1,0,-1],[1,-1,0],[1,0,0]], [[1,-1,0],[1,0,1],[-1,0,1]]]) #kernel


## Translation
translated = 100
new_I = np.zeros( (I.shape[0]-translated, I.shape[1], I.shape[2]) )

for i in range(translated, I.shape[0]):
for j in range(I.shape[1]):
for l in range(I.shape[2]):
new_I[i-translated,j,l] = I[i,j,l]

## Convolution
conv = np.zeros( (int((new_I.shape[0]-3)/2), int((new_I.shape[1]-3)/2) ) )

for i in range( conv.shape[0] ):
for j in range(conv.shape[1]):
conv[i, j] = convolution(new_I[2*i:2*i+3, 2*j:2*j+3, :], k)


scipy.misc.imsave('pics/convoled_image_2nd.png', conv)

我得到以下输出:

Translated then Convolved

现在,我切换卷积和平移步骤:

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
import scipy
import scipy.ndimage

I = scipy.ndimage.imread('pics/house.jpg')

def convolution(A, B):
return np.sum( np.multiply(A, B) )

k = np.array([[[0,1,-1],[1,-1,0],[0,0,0]], [[-1,0,-1],[1,-1,0],[1,0,0]], [[1,-1,0],[1,0,1],[-1,0,1]]]) #kernel


## Convolution
conv = np.zeros( (int((I.shape[0]-3)/2), int((I.shape[1]-3)/2) ) )

for i in range( conv.shape[0] ):
for j in range(conv.shape[1]):
conv[i, j] = convolution(I[2*i:2*i+3, 2*j:2*j+3, :], k)


## Translation
translated = 100
new_I = np.zeros( (conv.shape[0]-translated, conv.shape[1]) )

for i in range(translated, conv.shape[0]):
for j in range(conv.shape[1]):
new_I[i-translated,j] = conv[i,j]


scipy.misc.imsave('pics/conv_trans_image.png', new_I)

现在我得到以下输出:

First Convolved with kernel & then translated

书上说的不应该是一样的吗?我究竟做错了什么?

最佳答案

正如书中所说,卷积和平移的线性特性保证了它们的顺序可以互换,边界效应除外。

例如:

import numpy as np
from scipy import misc, ndimage, signal

def translate(img, dx):
img_t = np.zeros_like(img)
if dx == 0: img_t[:, :] = img[:, :]
elif dx > 0: img_t[:, dx:] = img[:, :-dx]
else: img_t[:, :dx] = img[:, -dx:]
return img_t

def convolution(img, k):
return np.sum([signal.convolve2d(img[:, :, c], k[:, :, c])
for c in range(img.shape[2])], axis=0)

img = ndimage.imread('house.jpg')

k = np.array([
[[ 0, 1, -1], [1, -1, 0], [ 0, 0, 0]],
[[-1, 0, -1], [1, -1, 0], [ 1, 0, 0]],
[[ 1, -1, 0], [1, 0, 1], [-1, 0, 1]]])

ct = translate(convolution(img, k), 100)
tc = convolution(translate(img, 100), k)

misc.imsave('conv_then_trans.png', ct)
misc.imsave('trans_then_conv.png', tc)

if np.all(ct[2:-2, 2:-2] == tc[2:-2, 2:-2]):
print('Equal!')

打印:

Equal!


问题是您在第二个示例中过度翻译了。将图像缩小 2 倍后,尝试按 50 进行翻译。

关于python - 证明卷积在平移方面是等变的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48603371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com