簡體   English   中英

使用 2D 過濾器卷積 3D 圖像

[英]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

我想在對圖像應用任何內核/過濾器之后查看圖像,所以我得到了以下內容

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, 內核)

ValueError:操作數無法與形狀一起廣播 (5,5,3) (3,5,5)

np.multiply 正在進行元素乘法。 但是,您的參數沒有匹配的維度。 您可以使用此轉置您的內核或圖像以確保它可以工作:

kernel = kernel.transpose()

您可以在np.multiply調用之前執行此np.multiply

ValueError:操作數無法與形狀一起廣播 (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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM