卷积 3D 图像与 2D 过滤器
Convolution 3D image with 2D filter
我有一张形状为 img.shape = (500, 439, 3)
的图像
卷积函数为
def convolution(image, kernel, stride=1, pad=0):
n_h, n_w, _ = image.shape
f = kernel.shape[0]
kernel = np.repeat(kernel[None,:], 3, axis=0)
n_H = int(((n_h + (2*pad) - f) / stride) + 1)
n_W = int(((n_w + (2*pad) - f) / stride) + 1)
n_C = 1
out = np.zeros((n_H, n_W, n_C))
for h in range(n_H):
vert_start = h*stride
vert_end = h*stride + f
for w in range(n_W):
horiz_start = w*stride
horiz_end = w*stride + f
for c in range(n_C):
a_slice_prev = image[vert_start:vert_end,
horiz_start:horiz_end, :]
s = np.multiply(a_slice_prev, kernel)
out[h, w, c] = np.sum(s, dtype=float)
return out
我想在对图像应用任何 kernel/filter 之后查看图像,所以我得到了以下内容
img = plt.imread('cat.png')
kernel = np.arange(25).reshape((5, 5))
out2 = convolution(img, kernel)
plt.imshow(out2)
plt.show()
我明白了
s = np.multiply(a_slice_prev, kernel)
ValueError: operands could not be broadcast together with shapes
(5,5,3) (3,5,5)
np.multiply 正在进行逐元素乘法。但是,您的论点没有匹配的维度。你可以用这个转置你的内核或图像以确保它可以工作:
kernel = kernel.transpose()
您可以在 np.multiply
通话之前执行此操作。
ValueError: operands could not be broadcast together with shapes (5,5,3) (3,5,5)
因为卷积是逐元素乘法,图像区域的形状应该是 (5,5,3)
,内核的形状应该是 (5,5,3)
,因此像这样重复你的内核:
kernel = np.arange(25).reshape((5, 5, 1))
kernel = np.repeat(kernel, 3, axis=2)
我有一张形状为 img.shape = (500, 439, 3)
卷积函数为
def convolution(image, kernel, stride=1, pad=0):
n_h, n_w, _ = image.shape
f = kernel.shape[0]
kernel = np.repeat(kernel[None,:], 3, axis=0)
n_H = int(((n_h + (2*pad) - f) / stride) + 1)
n_W = int(((n_w + (2*pad) - f) / stride) + 1)
n_C = 1
out = np.zeros((n_H, n_W, n_C))
for h in range(n_H):
vert_start = h*stride
vert_end = h*stride + f
for w in range(n_W):
horiz_start = w*stride
horiz_end = w*stride + f
for c in range(n_C):
a_slice_prev = image[vert_start:vert_end,
horiz_start:horiz_end, :]
s = np.multiply(a_slice_prev, kernel)
out[h, w, c] = np.sum(s, dtype=float)
return out
我想在对图像应用任何 kernel/filter 之后查看图像,所以我得到了以下内容
img = plt.imread('cat.png')
kernel = np.arange(25).reshape((5, 5))
out2 = convolution(img, kernel)
plt.imshow(out2)
plt.show()
我明白了
s = np.multiply(a_slice_prev, kernel)
ValueError: operands could not be broadcast together with shapes (5,5,3) (3,5,5)
np.multiply 正在进行逐元素乘法。但是,您的论点没有匹配的维度。你可以用这个转置你的内核或图像以确保它可以工作:
kernel = kernel.transpose()
您可以在 np.multiply
通话之前执行此操作。
ValueError: operands could not be broadcast together with shapes (5,5,3) (3,5,5)
因为卷积是逐元素乘法,图像区域的形状应该是 (5,5,3)
,内核的形状应该是 (5,5,3)
,因此像这样重复你的内核:
kernel = np.arange(25).reshape((5, 5, 1))
kernel = np.repeat(kernel, 3, axis=2)