2
\$\begingroup\$

I have a single image of shape img.shape = (500, 439, 3)

The convolution function is

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)
    kernel = kernel.transpose()

    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

The code for plotting is

img = plt.imread('cat.png')
kernel = np.arange(25).reshape((5, 5))
out2 = convolution(img, kernel)
plt.imshow(np.squeeze(out2))
plt.show()

The output seems to get a CYAN cover, is the logic of the code correct ?

enter image description here

\$\endgroup\$
  • \$\begingroup\$ The "CYAN cover" is likely because of the data type of out. ndarrays with float64 dtype, not in range [0, 1] are considered as "general data" and matplotlib falls back to its default colormap. \$\endgroup\$ – AlexV Feb 11 at 11:51
  • \$\begingroup\$ @AlexV is it possible to have a colored output? \$\endgroup\$ – PolarBear10 Feb 11 at 13:16
  • \$\begingroup\$ You will have to normalize your data before plotting, either to [0, 255] and using np.uint8 as dtype or [0, 1] for np.float64/np.float32. \$\endgroup\$ – AlexV Feb 11 at 13:29
  • \$\begingroup\$ @AlexV I normalize it using the following out2 -= out2.min() out2 /= out2.max() and then plt.imshow(np.squeeze(out2), vmin=out2.min(), vmax=out2.max()), when I print out print('Min: %.3f, Max: %.3f' % (out2.min(), out2.max())) I get my range from 0 to 1, my datatype is still though Data Type: float64 and the image is still CYAN, Using cmap=gray gives a grey output. But still not the coloured one I am hoping for. Is it actually possible to have a coloured image with only 1 channel ? \$\endgroup\$ – PolarBear10 Feb 11 at 13:54
  • 1
    \$\begingroup\$ Sorry, my bad! It's not possible to have a color image with just one channel. Grayscale is as "natural" as it gets. \$\endgroup\$ – AlexV Feb 11 at 14:13

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.